diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index e77d535..a3def26 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -197,7 +197,7 @@
                 LOGGER.log(Level.WARNING,
                         "Deleting the storage dir. initialRun = " + initialRun + ", systemState = " + systemState);
             }
-            localResourceRepository.deleteStorageData(true);
+            localResourceRepository.deleteStorageData();
         }
 
         datasetMemoryManager = new DatasetMemoryManager(storageProperties);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index 47e5ac9..8b417a9 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -41,12 +41,12 @@
 import org.apache.asterix.common.transactions.IRecoveryManager;
 import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
 import org.apache.asterix.common.utils.PrintUtil;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.event.schema.cluster.Cluster;
 import org.apache.asterix.event.schema.cluster.Node;
 import org.apache.asterix.messaging.MessagingChannelInterfaceFactory;
 import org.apache.asterix.messaging.NCMessageBroker;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
 import org.apache.asterix.utils.CompatibilityUtil;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.application.IServiceContext;
@@ -120,22 +120,13 @@
         if (latestCheckpoint != null) {
             CompatibilityUtil.ensureCompatibility(controllerService, latestCheckpoint.getStorageVersion());
         }
-        IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager();
-        final SystemState stateOnStartup = recoveryMgr.getSystemState();
-        if (stateOnStartup == SystemState.PERMANENT_DATA_LOSS) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("System state: " + SystemState.PERMANENT_DATA_LOSS);
-                LOGGER.info("Node ID: " + nodeId);
-                LOGGER.info("Stores: " + PrintUtil.toString(metadataProperties.getStores()));
-                LOGGER.info("Root Metadata Store: " + metadataProperties.getStores().get(nodeId)[0]);
-            }
-            PersistentLocalResourceRepository localResourceRepository =
-                    (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
-            localResourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+        if (LOGGER.isLoggable(Level.INFO)) {
+            IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager();
+            LOGGER.info("System state: " + recoveryMgr.getSystemState());
+            LOGGER.info("Node ID: " + nodeId);
+            LOGGER.info("Stores: " + PrintUtil.toString(metadataProperties.getStores()));
         }
-
         webManager = new WebManager();
-
         performLocalCleanUp();
     }
 
@@ -256,7 +247,7 @@
             for (Node node : nodes) {
                 String ncId = asterixInstanceName + "_" + node.getId();
                 if (ncId.equalsIgnoreCase(nodeId)) {
-                    String storeDir = ClusterProperties.INSTANCE.getStorageDirectoryName();
+                    String storeDir = StorageConstants.STORAGE_ROOT_DIR_NAME;
                     String nodeIoDevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
                     String[] ioDevicePaths = nodeIoDevices.trim().split(",");
                     for (int i = 0; i < ioDevicePaths.length; i++) {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
index 78bed6a..9d73407 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
@@ -34,6 +34,7 @@
 import org.apache.asterix.app.external.ExternalUDFLibrarian;
 import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.testframework.context.TestCaseContext;
 import org.apache.commons.lang.SystemUtils;
@@ -152,7 +153,7 @@
             File[] dataDirs = ioDevice.getMount().listFiles();
             for (File dataDir : dataDirs) {
                 String dirName = dataDir.getName();
-                if (!dirName.equals(ClusterProperties.DEFAULT_STORAGE_DIR_NAME)) {
+                if (!dirName.equals(StorageConstants.STORAGE_ROOT_DIR_NAME)) {
                     // Skips non-storage directories.
                     continue;
                 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
index 5b53041..47a561a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/MigrateStorageResourcesTaskTest.java
@@ -59,8 +59,8 @@
     public void storageStructureMigration() throws Exception {
         Function<IndexPathElements, String> legacyIndexPathProvider = (pathElements) ->
                 (pathElements.getRebalanceCount().equals("0") ? "" : pathElements.getRebalanceCount() + File.separator)
-                        + pathElements.getDatasetName() + StoragePathUtil.DATASET_INDEX_NAME_SEPARATOR + pathElements
-                        .getIndexName();
+                        + pathElements.getDatasetName() + StorageConstants.LEGACY_DATASET_INDEX_NAME_SEPARATOR
+                        + pathElements.getIndexName();
         StoragePathUtil.setIndexPathProvider(legacyIndexPathProvider);
         integrationUtil.init(true);
         // create dataset and insert data using legacy structure
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
index 0abb92f..cc3291d 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
@@ -38,7 +38,6 @@
 
     public static final ClusterProperties INSTANCE = new ClusterProperties();
     public static final String CLUSTER_CONFIGURATION_FILE = "cluster.xml";
-    public static final String DEFAULT_STORAGE_DIR_NAME = "storage";
     private String nodeNamePrefix = StringUtils.EMPTY;
     private Cluster cluster;
 
@@ -61,14 +60,6 @@
         return cluster;
     }
 
-    public String getStorageDirectoryName() {
-        if (cluster != null) {
-            return cluster.getStore();
-        }
-        // virtual cluster without cluster config file
-        return DEFAULT_STORAGE_DIR_NAME;
-    }
-
     public Node getNodeById(String nodeId) {
         Optional<Node> matchingNode = cluster.getNode().stream().filter(node -> node.getId().equals(nodeId)).findAny();
         return matchingNode.isPresent() ? matchingNode.get() : null;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
index 0d65067..bd057fa 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
@@ -22,7 +22,7 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
-import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.common.utils.StorageConstants;
 
 public class ResourceReference {
 
@@ -96,7 +96,7 @@
         int offset = tokens.length;
         ref.name = tokens[--offset];
         // split combined dataset/index name
-        final String[] indexTokens = tokens[--offset].split(StoragePathUtil.DATASET_INDEX_NAME_SEPARATOR);
+        final String[] indexTokens = tokens[--offset].split(StorageConstants.LEGACY_DATASET_INDEX_NAME_SEPARATOR);
         if (indexTokens.length != 2) {
             throw new IllegalStateException("Unrecognized legacy path structure: " + path);
         }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
index 48769d4..6262f71 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
@@ -25,8 +25,10 @@
  */
 public class StorageConstants {
 
-    public static final String METADATA_ROOT = "root_metadata";
+    public static final String STORAGE_ROOT_DIR_NAME = "storage";
+    public static final String PARTITION_DIR_PREFIX = "partition_";
     public static final String METADATA_FILE_NAME = ".metadata";
+    public static final String LEGACY_DATASET_INDEX_NAME_SEPARATOR = "_idx_";
 
     /**
      * The storage version of AsterixDB related artifacts (e.g. log files, checkpoint files, etc..).
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
index 5110d74..b93ccb5 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
@@ -37,9 +37,8 @@
 import org.apache.log4j.Logger;
 
 public class StoragePathUtil {
+
     private static final Logger LOGGER = Logger.getLogger(StoragePathUtil.class.getName());
-    public static final String PARTITION_DIR_PREFIX = "partition_";
-    public static final String DATASET_INDEX_NAME_SEPARATOR = "_idx_";
     private static Function<IndexPathElements, String> indexPathProvider;
 
     private StoragePathUtil() {
@@ -60,8 +59,9 @@
         return new MappedFileSplit(partition.getActiveNodeId(), relativePath, partition.getIODeviceNum());
     }
 
-    public static String prepareStoragePartitionPath(String storageDirName, int partitonId) {
-        return storageDirName + File.separator + StoragePathUtil.PARTITION_DIR_PREFIX + partitonId;
+    public static String prepareStoragePartitionPath(int partitonId) {
+        return Paths.get(StorageConstants.STORAGE_ROOT_DIR_NAME, StorageConstants.PARTITION_DIR_PREFIX + partitonId)
+                .toString();
     }
 
     public static String prepareDataverseIndexName(String dataverseName, String datasetName, String idxName,
@@ -80,12 +80,10 @@
         return datasetName + File.separator + rebalanceCount + File.separator + idxName;
     }
 
-    public static int getPartitionNumFromName(String name) {
-        return Integer.parseInt(name.substring(PARTITION_DIR_PREFIX.length()));
-    }
-
     public static int getPartitionNumFromRelativePath(String relativePath) {
-        int startIdx = relativePath.indexOf(PARTITION_DIR_PREFIX) + PARTITION_DIR_PREFIX.length();
+        int startIdx =
+                relativePath.indexOf(StorageConstants.PARTITION_DIR_PREFIX) + StorageConstants.PARTITION_DIR_PREFIX
+                        .length();
         String partition = relativePath.substring(startIdx, relativePath.indexOf(File.separatorChar, startIdx));
         return Integer.parseInt(partition);
     }
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
index 71cef80..c0f8f5f 100644
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
+++ b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
@@ -27,7 +27,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.event.driver.EventDriver;
 import org.apache.asterix.event.error.VerificationUtil;
 import org.apache.asterix.event.model.AsterixInstance;
@@ -142,10 +141,9 @@
         for (Node node : cluster.getNode()) {
             Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
             iodevices = node.getIodevices() == null ? instance.getCluster().getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + hdfsBackupDir + " " + "hdfs" + " " + node.getId() + " " + hdfsUrl + " "
-                    + hadoopVersion;
+            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " " + " "
+                    + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + " " + hdfsBackupDir + " " + "hdfs" + " "
+                    + node.getId() + " " + hdfsUrl + " " + hadoopVersion;
             Event event = new Event("backup", nodeid, pargs);
             patternList.add(new Pattern(null, 1, null, event));
         }
@@ -167,9 +165,8 @@
             Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
             iodevices = node.getIodevices() == null ? instance.getCluster().getIodevices() : node.getIodevices();
             txnLogDir = node.getTxnLogDir() == null ? instance.getCluster().getTxnLogDir() : node.getTxnLogDir();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " "
-                    + StorageConstants.METADATA_ROOT + " " + txnLogDir + " " + backupId + " " + backupDir
-                    + " " + "local" + " " + node.getId();
+            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " " + " " + txnLogDir + " "
+                    + backupId + " " + backupDir + " " + "local" + " " + node.getId();
             Event event = new Event("backup", nodeid, pargs);
             patternList.add(new Pattern(null, 1, null, event));
         }
@@ -190,10 +187,9 @@
         for (Node node : cluster.getNode()) {
             Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
             String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + " " + hdfsBackupDir + " " + "hdfs" + " " + node.getId() + " " + hdfsUrl + " "
-                    + hadoopVersion;
+            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " " + " "
+                    + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + " " + " " + hdfsBackupDir + " " + "hdfs"
+                    + " " + node.getId() + " " + hdfsUrl + " " + hadoopVersion;
             Event event = new Event("restore", nodeid, pargs);
             patternList.add(new Pattern(null, 1, null, event));
         }
@@ -211,9 +207,9 @@
         for (Node node : cluster.getNode()) {
             Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
             String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + backupDir + " " + "local" + " " + node.getId();
+            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " " + " "
+                    + AsterixEventServiceUtil.TXN_LOG_DIR + " " + backupId + " " + backupDir + " " + "local" + " "
+                    + node.getId();
             Event event = new Event("restore", nodeid, pargs);
             patternList.add(new Pattern(null, 1, null, event));
         }
@@ -285,7 +281,6 @@
             }
         }
         patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern());
-        patternList.addAll(createRemoveAsterixRootMetadata(instance).getPattern());
         patternList.addAll(createRemoveAsterixTxnLogs(instance).getPattern());
         return new Patterns(patternList);
     }
@@ -438,24 +433,6 @@
         return new Patterns(patternList);
     }
 
-    private Patterns createRemoveAsterixRootMetadata(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        Nodeid nodeid;
-        String pargs;
-        Event event;
-        for (Node node : cluster.getNode()) {
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            String primaryIODevice = iodevices.split(",")[0].trim();
-            pargs = primaryIODevice + File.separator + StorageConstants.METADATA_ROOT;
-            nodeid = new Nodeid(new Value(null, node.getId()));
-            event = new Event("file_delete", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-
-        return new Patterns(patternList);
-    }
-
     private Patterns createRemoveAsterixLogDirPattern(AsterixInstance instance) throws Exception {
         List<Pattern> patternList = new ArrayList<>();
         Cluster cluster = instance.getCluster();
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
index dad0d51..dc8a8aa 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
@@ -25,7 +25,6 @@
 import java.util.Map;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.utils.StoragePathUtil;
@@ -78,9 +77,7 @@
     public static FileSplit splitsForAdapter(String dataverseName, String feedName, String nodeName,
             ClusterPartition partition) {
         File relPathFile = new File(prepareDataverseFeedName(dataverseName, feedName));
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        String storagePartitionPath =
-                StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition.getPartitionId());
+        String storagePartitionPath = StoragePathUtil.prepareStoragePartitionPath(partition.getPartitionId());
         // Note: feed adapter instances in a single node share the feed logger
         // format: 'storage dir name'/partition_#/dataverse/feed/node
         File f = new File(storagePartitionPath + File.separator + relPathFile + File.separator + nodeName);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index 4c98904..0303392 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -28,13 +28,12 @@
 
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.context.AsterixVirtualBufferCacheProvider;
-import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
 import org.apache.asterix.common.context.CorrelatedPrefixMergePolicyFactory;
+import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.MetadataException;
@@ -313,8 +312,7 @@
         }
         ClusterPartition metadataPartition = appContext.getMetadataProperties().getMetadataPartition();
         int metadataDeviceId = metadataPartition.getIODeviceNum();
-        String metadataPartitionPath = StoragePathUtil.prepareStoragePartitionPath(
-                ClusterProperties.INSTANCE.getStorageDirectoryName(), metadataPartition.getPartitionId());
+        String metadataPartitionPath = StoragePathUtil.prepareStoragePartitionPath(metadataPartition.getPartitionId());
         String resourceName = metadataPartitionPath + File.separator + index.getFileNameRelativePath();
         FileReference file = ioManager.getFileReference(metadataDeviceId, resourceName);
         index.setFile(file);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
index e5f5c19..7ac6183 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
@@ -24,7 +24,6 @@
 
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
@@ -42,15 +41,12 @@
     }
 
     private static FileSplit[] getDataverseSplits(IClusterStateManager clusterStateManager, String dataverseName) {
-        File relPathFile = new File(dataverseName);
         List<FileSplit> splits = new ArrayList<>();
         // get all partitions
         ClusterPartition[] clusterPartition = clusterStateManager.getClusterPartitons();
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
         for (int j = 0; j < clusterPartition.length; j++) {
-            File f = new File(
-                    StoragePathUtil.prepareStoragePartitionPath(storageDirName, clusterPartition[j].getPartitionId())
-                            + File.separator + relPathFile);
+            File f = new File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition[j].getPartitionId()),
+                    dataverseName);
             splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition[j], f.getPath()));
         }
         return splits.toArray(new FileSplit[] {});
@@ -68,9 +64,8 @@
 
     public static FileSplit[] getIndexSplits(IClusterStateManager clusterStateManager, Dataset dataset,
             String indexName, List<String> nodes) {
-        File relPathFile = new File(StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
-                dataset.getDatasetName(), indexName, dataset.getRebalanceCount()));
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
+        final String relPath = StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName, dataset.getRebalanceCount());
         List<FileSplit> splits = new ArrayList<>();
         for (String nd : nodes) {
             int numPartitions = clusterStateManager.getNodePartitionsCount(nd);
@@ -81,9 +76,8 @@
             }
 
             for (int k = 0; k < numPartitions; k++) {
-                // format: 'storage dir name'/partition_#/dataverse/dataset_idx_index
-                File f = new File(StoragePathUtil.prepareStoragePartitionPath(storageDirName,
-                        nodePartitions[k].getPartitionId()) + File.separator + relPathFile);
+                File f = new File(StoragePathUtil.prepareStoragePartitionPath(nodePartitions[k].getPartitionId()),
+                        relPath);
                 splits.add(StoragePathUtil.getFileSplitForClusterPartition(nodePartitions[k], f.getPath()));
             }
         }
@@ -95,10 +89,4 @@
         FileSplit[] splits = getDataverseSplits(clusterStateManager, dataverse);
         return StoragePathUtil.splitProviderAndPartitionConstraints(splits);
     }
-
-    public static String getIndexPath(String partitionPath, int partition, String dataverse, String fullIndexName) {
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        return partitionPath + StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition) + File.separator
-                + StoragePathUtil.prepareDataverseIndexName(dataverse, fullIndexName);
-    }
 }
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
index df17987..f3eea32 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
@@ -39,6 +39,7 @@
 import org.apache.asterix.common.replication.IReplicationManager;
 import org.apache.asterix.common.transactions.ILogManager;
 import org.apache.asterix.common.transactions.IRecoveryManager;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.replication.storage.ReplicaResourcesManager;
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -191,8 +192,7 @@
                 datasetLifeCycleManager.closeAllDatasets();
 
                 //3. remove any existing storage data and initialize storage metadata
-                resourceRepository.deleteStorageData(true);
-                resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+                resourceRepository.deleteStorageData();
 
                 //4. select remote replicas to recover from per lost replica data
                 failbackRecoveryReplicas = constructRemoteRecoveryPlan();
@@ -295,8 +295,7 @@
                 datasetLifeCycleManager.closeAllDatasets();
 
                 //2. remove any existing storage data and initialize storage metadata
-                resourceRepository.deleteStorageData(true);
-                resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+                resourceRepository.deleteStorageData();
 
                 /*** Start Recovery Per Lost Replica ***/
                 for (Entry<String, Set<Integer>> remoteReplica : recoveryPlan.entrySet()) {
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
index 04cbef9..e87a39b 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
@@ -26,9 +26,9 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -36,11 +36,8 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.SortedMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -48,7 +45,6 @@
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.replication.IReplicationManager;
 import org.apache.asterix.common.replication.ReplicationJob;
 import org.apache.asterix.common.storage.DatasetResourceReference;
@@ -75,18 +71,12 @@
 
     public static final Predicate<Path> INDEX_COMPONENTS = path -> !path.endsWith(StorageConstants.METADATA_FILE_NAME);
     // Private constants
-    private static final Logger LOGGER = Logger.getLogger(PersistentLocalResourceRepository.class.getName());
-    private static final String STORAGE_METADATA_DIRECTORY = StorageConstants.METADATA_ROOT;
-    private static final String STORAGE_METADATA_FILE_NAME_PREFIX = "." + StorageConstants.METADATA_ROOT;
     private static final int MAX_CACHED_RESOURCES = 1000;
-    public static final int RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT = 6;
+    private static final int RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT = 6;
 
     // Finals
     private final IIOManager ioManager;
-    private final String[] mountPoints;
-    private final String nodeId;
     private final Cache<String, LocalResource> resourceCache;
-    private final SortedMap<Integer, ClusterPartition> clusterPartitions;
     private final Set<Integer> nodeOriginalPartitions;
     private final Set<Integer> nodeActivePartitions;
     // Mutables
@@ -94,27 +84,19 @@
     private Set<String> filesToBeReplicated;
     private IReplicationManager replicationManager;
     private Set<Integer> nodeInactivePartitions;
+    private final Path[] storageRoots;
 
-    public PersistentLocalResourceRepository(IIOManager ioManager, List<IODeviceHandle> devices, String nodeId,
-            MetadataProperties metadataProperties) throws HyracksDataException {
+    public PersistentLocalResourceRepository(IIOManager ioManager, String nodeId,
+            MetadataProperties metadataProperties) {
         this.ioManager = ioManager;
-        mountPoints = new String[devices.size()];
-        this.nodeId = nodeId;
-        this.clusterPartitions = metadataProperties.getClusterPartitions();
-        for (int i = 0; i < mountPoints.length; i++) {
-            String mountPoint = devices.get(i).getMount().getPath();
-            File mountPointDir = new File(mountPoint);
-            if (!mountPointDir.exists()) {
-                throw new HyracksDataException(mountPointDir.getAbsolutePath() + " doesn't exist.");
-            }
-            if (!mountPoint.endsWith(File.separator)) {
-                mountPoints[i] = mountPoint + File.separator;
-            } else {
-                mountPoints[i] = mountPoint;
-            }
+        storageRoots = new Path[ioManager.getIODevices().size()];
+        final List<IODeviceHandle> ioDevices = ioManager.getIODevices();
+        for (int i = 0; i < ioDevices.size(); i++) {
+            storageRoots[i] =
+                    Paths.get(ioDevices.get(i).getMount().getAbsolutePath(), StorageConstants.STORAGE_ROOT_DIR_NAME);
         }
+        createStorageRoots();
         resourceCache = CacheBuilder.newBuilder().maximumSize(MAX_CACHED_RESOURCES).build();
-
         ClusterPartition[] nodePartitions = metadataProperties.getNodePartitions().get(nodeId);
         //initially the node active partitions are the same as the original partitions
         nodeOriginalPartitions = new HashSet<>(nodePartitions.length);
@@ -136,47 +118,6 @@
         return aString.toString();
     }
 
-    public void initializeNewUniverse(String storageRoot) throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Initializing local resource repository ... ");
-        }
-        /*
-         * create storage metadata file
-         * (This file is used to locate the root storage directory after instance restarts).
-         * TODO with the existing cluster configuration file being static and distributed on all NCs
-         * we can find out the storage root directory without looking at this file.
-         * This file could potentially store more information, otherwise no need to keep it.
-         */
-        String storageRootDirName = storageRoot;
-        while (storageRootDirName.startsWith(File.separator)) {
-            storageRootDirName = storageRootDirName.substring(File.separator.length());
-        }
-        for (int i = 0; i < mountPoints.length; i++) {
-            FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, i);
-            File storageMetadataDir = storageMetadataFile.getFile().getParentFile();
-            if (storageMetadataDir.exists()) {
-                throw HyracksDataException.create(ErrorCode.ROOT_LOCAL_RESOURCE_EXISTS, getClass().getSimpleName(),
-                        storageMetadataDir.getAbsolutePath());
-            }
-            //make dirs for the storage metadata file
-            boolean success = storageMetadataDir.mkdirs();
-            if (!success) {
-                throw HyracksDataException
-                        .create(ErrorCode.ROOT_LOCAL_RESOURCE_COULD_NOT_BE_CREATED, getClass().getSimpleName(),
-                                storageMetadataDir.getAbsolutePath());
-            }
-            LOGGER.log(Level.INFO,
-                    "created the root-metadata-file's directory: " + storageMetadataDir.getAbsolutePath());
-            try (FileOutputStream fos = new FileOutputStream(storageMetadataFile.getFile())) {
-                fos.write(storageRootDirName.getBytes(StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw HyracksDataException.create(e);
-            }
-            LOGGER.log(Level.INFO, "created the root-metadata-file: " + storageMetadataFile.getAbsolutePath());
-        }
-        LOGGER.log(Level.INFO, "Completed the initialization of the local resource repository");
-    }
-
     @Override
     public LocalResource get(String relativePath) throws HyracksDataException {
         LocalResource resource = resourceCache.getIfPresent(relativePath);
@@ -208,7 +149,7 @@
             oosToFos.writeObject(resource);
             oosToFos.flush();
         } catch (IOException e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
 
         resourceCache.put(resource.getPath(), resource);
@@ -231,8 +172,7 @@
             } finally {
                 // Regardless of successfully deleted or not, the operation should be replicated.
                 //if replication enabled, delete resource from remote replicas
-                if (isReplicationEnabled && !resourceFile.getFile().getName()
-                        .startsWith(STORAGE_METADATA_FILE_NAME_PREFIX)) {
+                if (isReplicationEnabled) {
                     createReplicationJob(ReplicationOperation.DELETE, resourceFile);
                 }
             }
@@ -247,16 +187,11 @@
         String fileName = resourcePath + File.separator + StorageConstants.METADATA_FILE_NAME;
         return ioManager.resolve(fileName);
     }
+
     public Map<Long, LocalResource> getResources(Predicate<LocalResource> filter) throws HyracksDataException {
         Map<Long, LocalResource> resourcesMap = new HashMap<>();
-        for (int i = 0; i < mountPoints.length; i++) {
-            File storageRootDir = getStorageRootDirectoryIfExists(ioManager, nodeId, i);
-            if (storageRootDir == null) {
-                LOGGER.log(Level.INFO, "Getting storage root dir returned null. Returning");
-                continue;
-            }
-            LOGGER.log(Level.INFO, "Getting storage root dir returned " + storageRootDir.getAbsolutePath());
-            try (Stream<Path> stream = Files.find(storageRootDir.toPath(), RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT,
+        for (Path root : storageRoots) {
+            try (Stream<Path> stream = Files.find(root, RESOURCES_TREE_DEPTH_FROM_STORAGE_ROOT,
                     (path, attr) -> path.getFileName().toString().equals(StorageConstants.METADATA_FILE_NAME))) {
                 final List<File> resourceMetadataFiles = stream.map(Path::toFile).collect(Collectors.toList());
                 for (File file : resourceMetadataFiles) {
@@ -270,7 +205,6 @@
             }
         }
         return resourcesMap;
-
     }
 
     public Map<Long, LocalResource> loadAndGetAllResources() throws HyracksDataException {
@@ -300,7 +234,7 @@
                 throw new AsterixException("Storage version mismatch.");
             }
         } catch (Exception e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 
@@ -323,93 +257,23 @@
         try {
             replicationManager.submitJob(job);
         } catch (IOException e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 
-    public String[] getStorageMountingPoints() {
-        return mountPoints;
-    }
-
     /**
      * Deletes physical files of all data verses.
      *
-     * @param deleteStorageMetadata
      * @throws IOException
      */
-    public void deleteStorageData(boolean deleteStorageMetadata) throws IOException {
-        for (int i = 0; i < mountPoints.length; i++) {
-            File storageDir = getStorageRootDirectoryIfExists(ioManager, nodeId, i);
-            if (storageDir != null && storageDir.isDirectory()) {
-                FileUtils.deleteDirectory(storageDir);
-            }
-            if (deleteStorageMetadata) {
-                //delete the metadata root directory
-                FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, i);
-                File storageMetadataDir = storageMetadataFile.getFile().getParentFile().getParentFile();
-                if (storageMetadataDir.exists() && storageMetadataDir.isDirectory()) {
-                    FileUtils.deleteDirectory(storageMetadataDir);
-                }
+    public void deleteStorageData() throws IOException {
+        for (Path root : storageRoots) {
+            final File rootFile = root.toFile();
+            if (rootFile.exists()) {
+                FileUtils.deleteDirectory(rootFile);
             }
         }
-    }
-
-    /**
-     * @param mountPoint
-     * @param nodeId
-     * @param ioDeviceId
-     * @return A file reference to the storage metadata file.
-     */
-    private static FileReference getStorageMetadataFile(IIOManager ioManager, String nodeId, int ioDeviceId) {
-        String storageMetadataFileName =
-                STORAGE_METADATA_DIRECTORY + File.separator + nodeId + "_" + "iodevice" + ioDeviceId + File.separator
-                        + STORAGE_METADATA_FILE_NAME_PREFIX;
-        return new FileReference(ioManager.getIODevices().get(ioDeviceId), storageMetadataFileName);
-    }
-
-    /**
-     * @param mountPoint
-     * @param nodeId
-     * @param ioDeviceId
-     * @return A file reference to the storage root directory if exists, otherwise null.
-     * @throws HyracksDataException
-     */
-    public static File getStorageRootDirectoryIfExists(IIOManager ioManager, String nodeId, int ioDeviceId)
-            throws HyracksDataException {
-        try {
-            FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, ioDeviceId);
-            LOGGER.log(Level.INFO, "Storage metadata file is " + storageMetadataFile.getAbsolutePath());
-            if (storageMetadataFile.getFile().exists()) {
-                String storageRootDirPath =
-                        new String(Files.readAllBytes(storageMetadataFile.getFile().toPath()), StandardCharsets.UTF_8);
-                LOGGER.log(Level.INFO, "Storage metadata file found and root dir is " + storageRootDirPath);
-                FileReference storageRootFileRef =
-                        new FileReference(ioManager.getIODevices().get(ioDeviceId), storageRootDirPath);
-                if (storageRootFileRef.getFile().exists()) {
-                    return storageRootFileRef.getFile();
-                } else {
-                    LOGGER.log(Level.INFO, "Storage root doesn't exist");
-                }
-            } else {
-                LOGGER.log(Level.INFO, "Storage metadata file doesn't exist");
-            }
-            return null;
-        } catch (IOException ioe) {
-            throw HyracksDataException.create(ioe);
-        }
-    }
-
-    /**
-     * @param partition
-     * @return The partition local path on this NC.
-     */
-    public String getPartitionPath(int partition) {
-        //currently each partition is replicated on the same IO device number on all NCs.
-        return mountPoints[getIODeviceNum(partition)];
-    }
-
-    public int getIODeviceNum(int partition) {
-        return clusterPartitions.get(partition).getIODeviceNum();
+        createStorageRoots();
     }
 
     public Set<Integer> getActivePartitions() {
@@ -439,7 +303,7 @@
 
     /**
      * Gets a set of files for the indexes in partition {@code partition}. Each file points
-     * the to where the index's files are stored.
+     * to where the index's files are stored.
      *
      * @param partition
      * @return The set of indexes files
@@ -469,4 +333,14 @@
         final ResourceReference ref = ResourceReference.of(indexFile.toString());
         return ioManager.resolve(ref.getRelativePath().toString());
     }
+
+    private void createStorageRoots() {
+        for (Path root : storageRoots) {
+            try {
+                Files.createDirectories(root);
+            } catch (IOException e) {
+                throw new IllegalStateException("Failed to create storage root directory at " + root, e);
+            }
+        }
+    }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
index 93a7d83..43024b6 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
@@ -38,6 +38,6 @@
 
     @Override
     public ILocalResourceRepository createRepository() throws HyracksDataException {
-        return new PersistentLocalResourceRepository(ioManager, ioManager.getIODevices(), nodeId, metadataProperties);
+        return new PersistentLocalResourceRepository(ioManager, nodeId, metadataProperties);
     }
 }
