diff --git a/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/RuntimeContext.java b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/RuntimeContext.java
index 3336d6d..1e81763 100644
--- a/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/RuntimeContext.java
+++ b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/RuntimeContext.java
@@ -27,19 +27,22 @@
 import edu.uci.ics.hyracks.storage.common.buffercache.IPageReplacementStrategy;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapManager;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 import edu.uci.ics.hyracks.storage.common.smi.TransientFileMapManager;
 
 public class RuntimeContext {
     private IndexRegistry<IIndex> indexRegistry;
     private IBufferCache bufferCache;
     private IFileMapManager fileMapManager;
-
+    private IIndexArtifactMap indexArtifactMap;
+    
     public RuntimeContext(INCApplicationContext appCtx) {
         fileMapManager = new TransientFileMapManager();
         ICacheMemoryAllocator allocator = new HeapBufferAllocator();
         IPageReplacementStrategy prs = new ClockPageReplacementStrategy();
         bufferCache = new BufferCache(appCtx.getRootContext().getIOManager(), allocator, prs, fileMapManager, 32768, 50, 100);
         indexRegistry = new IndexRegistry<IIndex>();
+        indexArtifactMap = new TransientIndexArtifactMap();
     }
 
     public void close() {
@@ -61,4 +64,8 @@
     public static RuntimeContext get(IHyracksTaskContext ctx) {
         return (RuntimeContext) ctx.getJobletContext().getApplicationContext().getApplicationObject();
     }
+    
+    public IIndexArtifactMap getIndexArtifactMap() {
+        return indexArtifactMap;
+    }
 }
\ No newline at end of file
diff --git a/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/StorageManagerInterface.java b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/StorageManagerInterface.java
index 4c6363b..a1e94d2 100644
--- a/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/StorageManagerInterface.java
+++ b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/StorageManagerInterface.java
@@ -19,6 +19,7 @@
 import edu.uci.ics.hyracks.storage.common.IStorageManagerInterface;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 
 public class StorageManagerInterface implements IStorageManagerInterface {
     private static final long serialVersionUID = 1L;
@@ -37,4 +38,9 @@
     public IFileMapProvider getFileMapProvider(IHyracksTaskContext ctx) {
         return RuntimeContext.get(ctx).getFileMapManager();
     }
+    
+    @Override
+    public IIndexArtifactMap getIndexArtifactMap(IHyracksTaskContext ctx) {
+        return RuntimeContext.get(ctx).getIndexArtifactMap();
+    }
 }
\ No newline at end of file
diff --git a/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/TransientIndexArtifactMap.java b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/TransientIndexArtifactMap.java
new file mode 100644
index 0000000..c4a7561
--- /dev/null
+++ b/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/TransientIndexArtifactMap.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2009-2012 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package edu.uci.ics.hyracks.examples.btree.helper;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import edu.uci.ics.hyracks.api.io.IODeviceHandle;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
+
+public class TransientIndexArtifactMap implements IIndexArtifactMap {
+    private long counter = 0;
+    private Map<String, Long> name2IdMap = new HashMap<String, Long>();
+
+    @Override
+    public long create(String baseDir, List<IODeviceHandle> IODeviceHandles) throws IOException {
+        long resourceId = counter++;
+        String fullDir;
+        synchronized (name2IdMap) {
+            for (IODeviceHandle dev : IODeviceHandles) {
+                fullDir = dev.getPath().toString();
+                if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+                    fullDir += System.getProperty("file.separator");
+                }
+                fullDir += baseDir;
+                if (name2IdMap.containsKey(fullDir)) {
+                    throw new IOException();
+                }
+                name2IdMap.put(fullDir, resourceId);
+            }
+        }
+        return resourceId;
+    }
+
+    /**
+     * Search and return the resourceId indicated by fullDir from in-memory hashMap, name2IdMap.
+     * When there is no corresponding id in name2IdMap, return -1;
+     */
+    @Override
+    public long get(String fullDir) {
+        Long resourceId = -1L;
+
+        synchronized (name2IdMap) {
+            resourceId = name2IdMap.get(fullDir);
+        }
+
+        if (resourceId == null) {
+            return -1;
+        } else {
+            return resourceId;
+        }
+    }
+
+    @Override
+    public void delete(String baseDir, List<IODeviceHandle> IODeviceHandles) {
+        String fullDir;
+        synchronized (name2IdMap) {
+            for (IODeviceHandle dev : IODeviceHandles) {
+                fullDir = dev.getPath().toString();
+                if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+                    fullDir += System.getProperty("file.separator");
+                }
+                fullDir += baseDir;
+                name2IdMap.remove(fullDir);
+            }
+        }
+    }
+}
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
index f98aea2..9d45cb2 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
@@ -15,18 +15,24 @@
 
 package edu.uci.ics.hyracks.storage.am.common.dataflow;
 
+import java.io.IOException;
+import java.util.List;
+
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.api.io.FileReference;
+import edu.uci.ics.hyracks.api.io.IIOManager;
+import edu.uci.ics.hyracks.api.io.IODeviceHandle;
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.common.api.IOperationCallbackProvider;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 
 public abstract class IndexDataflowHelper {
     protected IIndex index;
     protected int indexFileId = -1;
-    
+
     protected final int partition;
     protected final IIndexOperatorDescriptor opDesc;
     protected final IHyracksTaskContext ctx;
@@ -38,50 +44,79 @@
     }
 
     public void init(boolean forceCreate) throws HyracksDataException {
-    	IBufferCache bufferCache = opDesc.getStorageManager().getBufferCache(ctx);
-    	IFileMapProvider fileMapProvider = opDesc.getStorageManager().getFileMapProvider(ctx);
-    	IndexRegistry<IIndex> indexRegistry = opDesc.getIndexRegistryProvider().getRegistry(ctx);
-    	FileReference fileRef = getFilereference();
-    	int fileId = -1;
-    	boolean fileIsMapped = false;
-    	synchronized (fileMapProvider) {
-    		fileIsMapped = fileMapProvider.isMapped(fileRef);
-    		if (!fileIsMapped) {
-    			bufferCache.createFile(fileRef);
-    		}            
-    		fileId = fileMapProvider.lookupFileId(fileRef);
-    		try {
-    	    	// Also creates the file if it doesn't exist yet.
-    			bufferCache.openFile(fileId);
-    		} catch (HyracksDataException e) {
-    			// Revert state of buffer cache since file failed to open.
-    			if (!fileIsMapped) {
-    				bufferCache.deleteFile(fileId, false);
-    			}
-    			throw e;
-    		}
-    	}
-    	// Only set indexFileId member after openFile() succeeds.
-    	indexFileId = fileId;    	
-    	// Create new index instance and register it.
-    	synchronized (indexRegistry) {
-    		// Check if the index has already been registered.
-    		boolean register = false;
-    	    index = indexRegistry.get(indexFileId);
-    		if (index == null) {
-    		    index = createIndexInstance();
-    		    register = true;
-    		}
-    		if (forceCreate) {
-    		    index.create(indexFileId);
-    		}
-    		index.open(indexFileId);
-    		if (register) {
-    		    indexRegistry.register(indexFileId, index);
-    		}
-    	}
+        IBufferCache bufferCache = opDesc.getStorageManager().getBufferCache(ctx);
+        IFileMapProvider fileMapProvider = opDesc.getStorageManager().getFileMapProvider(ctx);
+        IndexRegistry<IIndex> indexRegistry = opDesc.getIndexRegistryProvider().getRegistry(ctx);
+        FileReference fileRef = getFilereference();
+        IIndexArtifactMap indexArtifactMap = opDesc.getStorageManager().getIndexArtifactMap(ctx);
+        int fileId = -1;
+        boolean fileIsMapped = false;
+        synchronized (fileMapProvider) {
+            fileIsMapped = fileMapProvider.isMapped(fileRef);
+            if (!fileIsMapped) {
+                bufferCache.createFile(fileRef);
+            }
+            fileId = fileMapProvider.lookupFileId(fileRef);
+            try {
+                // Also creates the file if it doesn't exist yet.
+                bufferCache.openFile(fileId);
+            } catch (HyracksDataException e) {
+                // Revert state of buffer cache since file failed to open.
+                if (!fileIsMapped) {
+                    bufferCache.deleteFile(fileId, false);
+                }
+                throw e;
+            }
+        }
+
+        // check whether the requested index instance already exists by
+        // retrieving indexRegistry with resourceId
+        // To do so, checking the index directory in the first ioDevice is
+        // sufficient.
+
+        // create a fullDir(= IODeviceDir + baseDir) for the requested index
+        IIOManager ioManager = ctx.getIOManager();
+        List<IODeviceHandle> ioDeviceHandles = ioManager.getIODevices();
+        String fullDir = ioDeviceHandles.get(0).getPath().toString();
+        if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+            fullDir += System.getProperty("file.separator");
+        }
+        String baseDir = fileRef.getFile().getPath();
+        if (!baseDir.endsWith(System.getProperty("file.separator"))) {
+            baseDir += System.getProperty("file.separator");
+        }
+        fullDir += baseDir;
+
+        // get the corresponding resourceId with the fullDir
+        long resourceId = indexArtifactMap.get(fullDir);
+
+        // Only set indexFileId member after openFile() succeeds.
+        indexFileId = fileId;
+        // Create new index instance and register it.
+        synchronized (indexRegistry) {
+            // Check if the index has already been registered.
+            boolean register = false;
+            index = indexRegistry.get(resourceId);
+            if (index == null) {
+                index = createIndexInstance();
+                register = true;
+            }
+            if (forceCreate) {
+                index.create(indexFileId);
+                // Create new resourceId
+                try {
+                    resourceId = indexArtifactMap.create(baseDir, ioDeviceHandles);
+                } catch (IOException e) {
+                    throw new HyracksDataException(e);
+                }
+            }
+            index.open(indexFileId);
+            if (register) {
+                indexRegistry.register(resourceId, index);
+            }
+        }
     }
-    
+
     public abstract IIndex createIndexInstance() throws HyracksDataException;
 
     public FileReference getFilereference() {
@@ -96,7 +131,7 @@
             indexFileId = -1;
         }
     }
-    
+
     public IIndex getIndex() {
         return index;
     }
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexRegistry.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexRegistry.java
index 9aba0be..7a95572 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexRegistry.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/IndexRegistry.java
@@ -19,17 +19,17 @@
 
 public class IndexRegistry<IndexType> {
 
-    private HashMap<Integer, IndexType> map = new HashMap<Integer, IndexType>();
+    private HashMap<Long, IndexType> map = new HashMap<Long, IndexType>();
 
-    public IndexType get(int indexId) {
+    public IndexType get(long indexId) {
         return map.get(indexId);
     }
 
-    public void register(int indexId, IndexType index) {
+    public void register(long indexId, IndexType index) {
         map.put(indexId, index);
     }
 
-    public void unregister(int indexId) {
+    public void unregister(long indexId) {
         map.remove(indexId);
     }
 
diff --git a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexDropOperatorNodePushable.java b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexDropOperatorNodePushable.java
index 5c96af8..e866c34 100644
--- a/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexDropOperatorNodePushable.java
+++ b/hyracks-storage-am-common/src/main/java/edu/uci/ics/hyracks/storage/am/common/dataflow/TreeIndexDropOperatorNodePushable.java
@@ -15,6 +15,7 @@
 
 package edu.uci.ics.hyracks.storage.am.common.dataflow;
 
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -23,11 +24,14 @@
 import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.api.io.FileReference;
+import edu.uci.ics.hyracks.api.io.IIOManager;
+import edu.uci.ics.hyracks.api.io.IODeviceHandle;
 import edu.uci.ics.hyracks.dataflow.std.base.AbstractOperatorNodePushable;
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.common.IStorageManagerInterface;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 
 public class TreeIndexDropOperatorNodePushable extends AbstractOperatorNodePushable {
     private static final Logger LOGGER = Logger.getLogger(TreeIndexDropOperatorNodePushable.class.getName());
@@ -68,8 +72,29 @@
             IndexRegistry<IIndex> treeIndexRegistry = treeIndexRegistryProvider.getRegistry(ctx);
             IBufferCache bufferCache = storageManager.getBufferCache(ctx);
             IFileMapProvider fileMapProvider = storageManager.getFileMapProvider(ctx);
-            
+            IIndexArtifactMap indexArtifactMap = storageManager.getIndexArtifactMap(ctx);
+
             FileReference f = fileSplitProvider.getFileSplits()[partition].getLocalFile();
+
+            //check whether the requested index instance already exists by retrieving indexRegistry with resourceId
+            //To do so, checking the index directory in the first ioDevice is sufficient.
+
+            //create a fullDir(= IODeviceDir + baseDir) for the requested index
+            IIOManager ioManager = ctx.getIOManager();
+            List<IODeviceHandle> ioDeviceHandles = ioManager.getIODevices();
+            String fullDir = ioDeviceHandles.get(0).getPath().toString();
+            if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+                fullDir += System.getProperty("file.separator");
+            }
+            String baseDir = f.getFile().getPath();
+            if (!baseDir.endsWith(System.getProperty("file.separator"))) {
+                baseDir += System.getProperty("file.separator");
+            }
+            fullDir += baseDir;
+
+            //get the corresponding resourceId with the fullDir
+            long resourceId = indexArtifactMap.get(fullDir);
+
             int indexFileId = -1;
             synchronized (fileMapProvider) {
                 boolean fileIsMapped = fileMapProvider.isMapped(f);
@@ -81,7 +106,8 @@
             }
             // Unregister tree instance.
             synchronized (treeIndexRegistry) {
-                treeIndexRegistry.unregister(indexFileId);
+                treeIndexRegistry.unregister(resourceId);
+                indexArtifactMap.delete(baseDir, ioDeviceHandles);
             }
 
             // remove name to id mapping
diff --git a/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/IStorageManagerInterface.java b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/IStorageManagerInterface.java
index 562305e..aae9d67 100644
--- a/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/IStorageManagerInterface.java
+++ b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/IStorageManagerInterface.java
@@ -19,9 +19,12 @@
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 
 public interface IStorageManagerInterface extends Serializable {
-    public IBufferCache getBufferCache(IHyracksTaskContext ctx);
+	public IBufferCache getBufferCache(IHyracksTaskContext ctx);
 
-    public IFileMapProvider getFileMapProvider(IHyracksTaskContext ctx);
+	public IFileMapProvider getFileMapProvider(IHyracksTaskContext ctx);
+
+	public IIndexArtifactMap getIndexArtifactMap(IHyracksTaskContext ctx);
 }
\ No newline at end of file
diff --git a/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IIndexArtifactMap.java b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IIndexArtifactMap.java
new file mode 100644
index 0000000..428d11f
--- /dev/null
+++ b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IIndexArtifactMap.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009-2012 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package edu.uci.ics.hyracks.storage.common.file;
+
+import java.io.IOException;
+import java.util.List;
+
+import edu.uci.ics.hyracks.api.io.IODeviceHandle;
+
+/**
+ * IIndexArtifactMap provides interface to create an index artifact(that is a resourceId, but can be generalized to accommodate any artifact later) and retrieve it.
+ * 
+ * @author kisskys
+ */
+public interface IIndexArtifactMap {
+    /**
+     * Creates an artifact(resourceId) indicated by @param baseDir and @param ioDeviceHandles and return it.
+     * 
+     * @param baseDir
+     * @param ioDeviceHandles
+     * @return a created artifact if it is created successfully.
+     * @throws IOException
+     *             if the corresponding artifact already exists
+     */
+    public long create(String baseDir, List<IODeviceHandle> ioDeviceHandles) throws IOException;
+
+    /**
+     * Retrieves the artifact(resourceId) indicated by @param fullDir
+     * 
+     * @param fullDir
+     * @return the retrieved artifact if it exists, -1 otherwise.
+     */
+    public long get(String fullDir);
+
+    /**
+     * Deletes an artifact(resourceId) indicated by @param baseDir and @param ioDeviceHandles.
+     * 
+     * @param fullDir
+     */
+    public void delete(String baseDir, List<IODeviceHandle> ioDeviceHandles);
+}
diff --git a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestIndexArtifactMap.java b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestIndexArtifactMap.java
new file mode 100644
index 0000000..e10ea4e
--- /dev/null
+++ b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestIndexArtifactMap.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2009-2012 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package edu.uci.ics.hyracks.test.support;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import edu.uci.ics.hyracks.api.io.IODeviceHandle;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
+
+public class TestIndexArtifactMap implements IIndexArtifactMap {
+
+    private long counter = 0;
+    private Map<String, Long> name2IdMap = new HashMap<String, Long>();
+
+    @Override
+    public long create(String baseDir, List<IODeviceHandle> IODeviceHandles) throws IOException {
+        long resourceId = counter++;
+        String fullDir;
+        synchronized (name2IdMap) {
+            for (IODeviceHandle dev : IODeviceHandles) {
+                fullDir = dev.getPath().toString();
+                if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+                    fullDir += System.getProperty("file.separator");
+                }
+                fullDir += baseDir;
+                if (name2IdMap.containsKey(fullDir)) {
+                    throw new IOException();
+                }
+                name2IdMap.put(fullDir, resourceId);
+            }
+        }
+        return resourceId;
+    }
+
+    /**
+     * Search and return the resourceId indicated by fullDir from in-memory
+     * hashMap, name2IdMap. When there is no corresponding id in name2IdMap,
+     * return -1;
+     */
+    @Override
+    public long get(String fullDir) {
+        Long resourceId = -1L;
+
+        synchronized (name2IdMap) {
+            resourceId = name2IdMap.get(fullDir);
+        }
+
+        if (resourceId == null) {
+            return -1;
+        } else {
+            return resourceId;
+        }
+    }
+
+    @Override
+    public void delete(String baseDir, List<IODeviceHandle> IODeviceHandles) {
+        String fullDir;
+        synchronized (name2IdMap) {
+            for (IODeviceHandle dev : IODeviceHandles) {
+                fullDir = dev.getPath().toString();
+                if (!fullDir.endsWith(System.getProperty("file.separator"))) {
+                    fullDir += System.getProperty("file.separator");
+                }
+                fullDir += baseDir;
+                name2IdMap.remove(fullDir);
+            }
+        }
+    }
+}
diff --git a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerComponentHolder.java b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerComponentHolder.java
index ccbe862..5d250c8 100644
--- a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerComponentHolder.java
+++ b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerComponentHolder.java
@@ -33,6 +33,7 @@
 import edu.uci.ics.hyracks.storage.common.buffercache.IPageReplacementStrategy;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapManager;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 import edu.uci.ics.hyracks.storage.common.smi.TransientFileMapManager;
 
 public class TestStorageManagerComponentHolder {
@@ -40,7 +41,8 @@
     private static IFileMapProvider fileMapProvider;
     private static IndexRegistry<IIndex> indexRegistry;
     private static IOManager ioManager;
-    
+    private static IIndexArtifactMap indexArtifactMap;
+
     private static int pageSize;
     private static int numPages;
     private static int maxOpenFiles;
@@ -52,6 +54,7 @@
         bufferCache = null;
         fileMapProvider = null;
         indexRegistry = null;
+        indexArtifactMap = null;
     }
 
     public synchronized static IBufferCache getBufferCache(IHyracksTaskContext ctx) {
@@ -78,13 +81,20 @@
         }
         return indexRegistry;
     }
-    
+
     public synchronized static IOManager getIOManager() throws HyracksException {
-    	if (ioManager == null) {
-    		List<IODeviceHandle> devices = new ArrayList<IODeviceHandle>();
-    		devices.add(new IODeviceHandle(new File(System.getProperty("java.io.tmpdir")), "iodev_test_wa"));
-    		ioManager = new IOManager(devices, Executors.newCachedThreadPool());
-    	}
-    	return ioManager;
+        if (ioManager == null) {
+            List<IODeviceHandle> devices = new ArrayList<IODeviceHandle>();
+            devices.add(new IODeviceHandle(new File(System.getProperty("java.io.tmpdir")), "iodev_test_wa"));
+            ioManager = new IOManager(devices, Executors.newCachedThreadPool());
+        }
+        return ioManager;
+    }
+
+    public synchronized static IIndexArtifactMap getIndexArtifactMap(IHyracksTaskContext ctx) {
+        if (indexArtifactMap == null) {
+            indexArtifactMap = new TestIndexArtifactMap();
+        }
+        return indexArtifactMap;
     }
 }
\ No newline at end of file
diff --git a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerInterface.java b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerInterface.java
index 4059ef0..3ee93a4 100644
--- a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerInterface.java
+++ b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestStorageManagerInterface.java
@@ -18,6 +18,7 @@
 import edu.uci.ics.hyracks.storage.common.IStorageManagerInterface;
 import edu.uci.ics.hyracks.storage.common.buffercache.IBufferCache;
 import edu.uci.ics.hyracks.storage.common.file.IFileMapProvider;
+import edu.uci.ics.hyracks.storage.common.file.IIndexArtifactMap;
 
 public class TestStorageManagerInterface implements IStorageManagerInterface {
     private static final long serialVersionUID = 1L;
@@ -31,4 +32,9 @@
     public IFileMapProvider getFileMapProvider(IHyracksTaskContext ctx) {
         return TestStorageManagerComponentHolder.getFileMapProvider(ctx);
     }
+
+    @Override
+    public IIndexArtifactMap getIndexArtifactMap(IHyracksTaskContext ctx) {
+        return TestStorageManagerComponentHolder.getIndexArtifactMap(ctx);
+    }
 }
\ No newline at end of file
