diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
index 28a42f5..8d60ec6 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.api.common;
 
 import static org.apache.asterix.api.common.AsterixHyracksIntegrationUtil.LoggerHolder.LOGGER;
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
 
 import java.io.File;
 import java.io.IOException;
@@ -47,8 +48,10 @@
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.kohsuke.args4j.CmdLineException;
 
 public class AsterixHyracksIntegrationUtil {
     static class LoggerHolder {
@@ -58,7 +61,7 @@
         }
     }
 
-    private static final String IO_DIR_KEY = "java.io.tmpdir";
+    protected static final String IO_DIR_KEY = "java.io.tmpdir";
     public static final int DEFAULT_HYRACKS_CC_CLIENT_PORT = 1098;
     public static final int DEFAULT_HYRACKS_CC_CLUSTER_PORT = 1099;
 
@@ -76,13 +79,16 @@
         final CCConfig ccConfig = createCCConfig(configManager);
         cc = new ClusterControllerService(ccConfig, ccApplication);
 
-        nodeNames = ccConfig.getConfigManager().getNodeNames();
+
+            nodeNames = ccConfig.getConfigManager().getNodeNames();
         if (deleteOldInstanceData) {
             deleteTransactionLogs();
             removeTestStorageFiles();
         }
         final List<NodeControllerService> nodeControllers = new ArrayList<>();
         for (String nodeId : nodeNames) {
+            // mark this NC as virtual in the CC's config manager, so he doesn't try to contact NCService...
+            configManager.set(nodeId, NCConfig.Option.VIRTUAL_NC, true);
             final INCApplication ncApplication = createNCApplication();
             ConfigManager ncConfigManager = new ConfigManager();
             ncApplication.registerConfig(ncConfigManager);
@@ -113,13 +119,6 @@
         for (Thread thread : startupThreads) {
             thread.join();
         }
-        for (NodeControllerService nc : nodeControllers) {
-            for (String ioDevice : nc.getConfiguration().getIODevices()) {
-                if (!new File(ioDevice).isAbsolute()) {
-                    throw new IllegalStateException("iodevice not absolute: " + ioDevice);
-                }
-            }
-        }
         // Wait until cluster becomes active
         ClusterStateManager.INSTANCE.waitForState(ClusterState.ACTIVE);
         hcc = new HyracksConnection(cc.getConfig().getClientListenAddress(), cc.getConfig().getClientListenPort());
@@ -134,6 +133,7 @@
         ccConfig.setClusterListenPort(DEFAULT_HYRACKS_CC_CLUSTER_PORT);
         ccConfig.setResultTTL(120000L);
         ccConfig.setResultSweepThreshold(1000L);
+        configManager.set(ControllerConfig.Option.DEFAULT_DIR, joinPath(System.getProperty(IO_DIR_KEY), "asterixdb"));
         return ccConfig;
     }
 
@@ -152,6 +152,8 @@
         ncConfig.setResultTTL(120000L);
         ncConfig.setResultSweepThreshold(1000L);
         ncConfig.setVirtualNC(true);
+        configManager.set(ControllerConfig.Option.DEFAULT_DIR,
+                joinPath(System.getProperty(IO_DIR_KEY), "asterixdb", ncName));
         return ncConfig;
     }
 
@@ -159,32 +161,22 @@
         return new NCApplication();
     }
 
-    private NCConfig fixupIODevices(NCConfig ncConfig) throws IOException, AsterixException {
-        PropertiesAccessor accessor = PropertiesAccessor.getInstance(ncConfig.getAppConfig());
-        String tempPath = System.getProperty(IO_DIR_KEY);
-        if (tempPath.endsWith(File.separator)) {
-            tempPath = tempPath.substring(0, tempPath.length() - 1);
-        }
-        LOGGER.info("Using the temp path: " + tempPath);
-        // get initial partitions from properties
-        String[] nodeStores = accessor.getStores().get(ncConfig.getNodeId());
+    private NCConfig fixupIODevices(NCConfig ncConfig) throws IOException, AsterixException, CmdLineException {
+        // we have to first process the config
+        ncConfig.getConfigManager().processConfig();
+
+        // get initial partitions from config
+        String[] nodeStores = ncConfig.getAppConfig().getStringArray(NCConfig.Option.IODEVICES);
         if (nodeStores == null) {
             throw new IllegalStateException("Couldn't find stores for NC: " + ncConfig.getNodeId());
         }
         String tempDirPath = System.getProperty(IO_DIR_KEY);
-        if (!tempDirPath.endsWith(File.separator)) {
-            tempDirPath += File.separator;
-        }
-        List<String> ioDevices = new ArrayList<>();
-        for (String nodeStore : nodeStores) {
+        LOGGER.info("Using the temp path: " + tempDirPath);
+        for (int i = 0; i < nodeStores.length; i++) {
             // create IO devices based on stores
-            String iodevicePath = tempDirPath + ncConfig.getNodeId() + File.separator + nodeStore;
-            File ioDeviceDir = new File(iodevicePath);
-            ioDeviceDir.mkdirs();
-            ioDevices.add(iodevicePath);
+            nodeStores[i] = joinPath(tempDirPath, ncConfig.getNodeId(), nodeStores[i]);
         }
-        ncConfig.getConfigManager().set(ncConfig.getNodeId(), NCConfig.Option.IODEVICES,
-                ioDevices.toArray(new String[0]));
+        ncConfig.getConfigManager().set(ncConfig.getNodeId(), NCConfig.Option.IODEVICES, nodeStores);
         return ncConfig;
     }
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
index 233daa7..1ea512a 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
@@ -134,6 +134,8 @@
                 stores.put(store.getNcId(), nodeStores);
                 nodePartitionsMap.put(store.getNcId(), nodePartitions);
                 configManager.registerVirtualNode(store.getNcId());
+                // push the store info to the config manager
+                configManager.set(store.getNcId(), NCConfig.Option.IODEVICES, nodeStores);
                 // marking node as virtual, as we're not using NCServices with old-style config
                 configManager.set(store.getNcId(), NCConfig.Option.VIRTUAL_NC, true);
             }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
index 585e8ec..8d3e0a7 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
@@ -70,7 +70,7 @@
         checkpointDir = new File(checkpointDirPath);
         // Create the checkpoint directory if missing
         if (!checkpointDir.exists()) {
-            (new File(checkpointDirPath)).mkdir();
+            checkpointDir.mkdirs();
         }
         lsnThreshold = checkpointProperties.getLsnThreshold();
         pollFrequency = checkpointProperties.getPollFrequency();
