diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
index 3e494ba..209e5e2 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
@@ -10,7 +10,7 @@
 import edu.uci.ics.genomix.pregelix.format.LogAlgorithmForPathMergeInputFormat;
 import edu.uci.ics.genomix.pregelix.io.ValueStateWritable;
 import edu.uci.ics.genomix.pregelix.operator.NaiveAlgorithmForPathMergeVertex;
-import edu.uci.ics.genomix.pregelix.operator.TwoStepLogAlgorithmForPathMergeVertex;
+import edu.uci.ics.genomix.pregelix.operator.LogAlgorithmForPathMergeVertex;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.pregelix.api.job.PregelixJob;
 
@@ -27,7 +27,7 @@
         job.setDynamicVertexValueSize(true);
         job.setOutputKeyClass(KmerBytesWritable.class);
         job.setOutputValueClass(ValueStateWritable.class);
-        job.getConfiguration().setInt(NaiveAlgorithmForPathMergeVertex.KMER_SIZE, 55);
+        job.getConfiguration().setInt(NaiveAlgorithmForPathMergeVertex.KMER_SIZE, 5);
         job.getConfiguration().writeXml(new FileOutputStream(new File(outputPath)));
     }
     
@@ -35,20 +35,20 @@
     	generateNaiveAlgorithmForMergeGraphJob("NaiveAlgorithmForMergeGraph", outputBase + "NaiveAlgorithmForMergeGraph.xml");
     }
     
-    private static void generateTwoStepLogAlgorithmForMergeGraphJob(String jobName, String outputPath) throws IOException {
+    private static void generateLogAlgorithmForMergeGraphJob(String jobName, String outputPath) throws IOException {
     	PregelixJob job = new PregelixJob(jobName);
-    	job.setVertexClass(TwoStepLogAlgorithmForPathMergeVertex.class);
+    	job.setVertexClass(LogAlgorithmForPathMergeVertex.class);
         job.setVertexInputFormatClass(LogAlgorithmForPathMergeInputFormat.class); 
         job.setVertexOutputFormatClass(LogAlgorithmForPathMergeOutputFormat.class);
         job.setDynamicVertexValueSize(true);
         job.setOutputKeyClass(KmerBytesWritable.class);
         job.setOutputValueClass(ValueStateWritable.class);
-        job.getConfiguration().setInt(TwoStepLogAlgorithmForPathMergeVertex.KMER_SIZE, 5);
+        job.getConfiguration().setInt(LogAlgorithmForPathMergeVertex.KMER_SIZE, 5);
         job.getConfiguration().writeXml(new FileOutputStream(new File(outputPath)));
     }
     
-    private static void genTwoStepLogAlgorithmForMergeGraph() throws IOException {
-    	generateTwoStepLogAlgorithmForMergeGraphJob("TwoStepLogAlgorithmForMergeGraph", outputBase + "TwoStepLogAlgorithmForMergeGraph.xml");
+    private static void genLogAlgorithmForMergeGraph() throws IOException {
+    	generateLogAlgorithmForMergeGraphJob("LogAlgorithmForMergeGraph", outputBase + "LogAlgorithmForMergeGraph.xml");
     }
     
 	/**
@@ -57,7 +57,7 @@
 	 */
 	public static void main(String[] args) throws IOException {
 		genNaiveAlgorithmForMergeGraph();
-		genTwoStepLogAlgorithmForMergeGraph();
+		genLogAlgorithmForMergeGraph();
 	}
 
 }
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestCase.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestCase.java
new file mode 100644
index 0000000..1acf79b
--- /dev/null
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestCase.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2009-2010 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.genomix.pregelix.JobRun;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
+import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
+import org.junit.Test;
+
+import edu.uci.ics.genomix.pregelix.sequencefile.GenerateTextFile;
+import edu.uci.ics.pregelix.api.job.PregelixJob;
+import edu.uci.ics.pregelix.core.base.IDriver.Plan;
+import edu.uci.ics.pregelix.core.driver.Driver;
+import edu.uci.ics.pregelix.core.util.PregelixHyracksIntegrationUtil;
+
+public class PathMergeSmallTestCase extends TestCase {
+	private final PregelixJob job;
+	private final String resultFileDir;
+	private final String textFileDir;
+	private final String jobFile;
+	private final Driver driver = new Driver(this.getClass());
+	private final FileSystem dfs;
+
+	public PathMergeSmallTestCase(String hadoopConfPath, String jobName,
+			String jobFile, FileSystem dfs, String hdfsInput, String resultFile, String textFile)
+			throws Exception {
+		super("test");
+		this.jobFile = jobFile;
+		this.job = new PregelixJob("test");
+		this.job.getConfiguration().addResource(new Path(jobFile));
+		this.job.getConfiguration().addResource(new Path(hadoopConfPath));
+		FileInputFormat.setInputPaths(job, hdfsInput);
+		FileOutputFormat.setOutputPath(job, new Path(hdfsInput + "_result"));
+		this.textFileDir = textFile;
+		job.setJobName(jobName);
+		this.resultFileDir = resultFile;
+		
+		this.dfs = dfs;
+	}
+
+	private void waitawhile() throws InterruptedException {
+		synchronized (this) {
+			this.wait(20);
+		}
+	}
+
+	@Test
+	public void test() throws Exception {
+		setUp();
+		Plan[] plans = new Plan[] { Plan.OUTER_JOIN };
+		for (Plan plan : plans) {
+			driver.runJob(job, plan, PregelixHyracksIntegrationUtil.CC_HOST,
+					PregelixHyracksIntegrationUtil.TEST_HYRACKS_CC_CLIENT_PORT,
+					false);
+		}
+		compareResults();
+		tearDown();
+		waitawhile();
+	}
+
+	private void compareResults() throws Exception {
+		dfs.copyToLocalFile(FileOutputFormat.getOutputPath(job), new Path(
+				resultFileDir));
+		GenerateTextFile.generateFromPathmergeResult(5, resultFileDir, textFileDir);
+		// TestUtils.compareWithResultDir(new File(expectedFileDir), new
+		// File(resultFileDir));
+	}
+
+	public String toString() {
+		return jobFile;
+	}
+
+}
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestSuite.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestSuite.java
new file mode 100644
index 0000000..956a646
--- /dev/null
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeSmallTestSuite.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2009-2010 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.genomix.pregelix.JobRun;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hdfs.MiniDFSCluster;
+import org.apache.hadoop.mapred.JobConf;
+
+import edu.uci.ics.pregelix.core.jobgen.clusterconfig.ClusterConfig;
+import edu.uci.ics.pregelix.core.util.PregelixHyracksIntegrationUtil;
+
+@SuppressWarnings("deprecation")
+public class PathMergeSmallTestSuite extends TestSuite {
+	private static final Logger LOGGER = Logger
+			.getLogger(PathMergeSmallTestSuite.class.getName());
+
+	public static final String PreFix = "data/PathTestSet"; //"graphbuildresult";
+	public static final String[] TestDir = { PreFix + File.separator
+		//+  "split.aa"};
+		///+ "split.aa"};/*, PreFix + File.separator
+		/*+ "CyclePath", PreFix + File.separator
+		+ "SimplePath", PreFix + File.separator
+		+ "SinglePath", PreFix + File.separator
+		+ "TreePath"};*/
+		+ "2", PreFix + File.separator
+		+ "3", PreFix + File.separator
+		+ "4", PreFix + File.separator
+		+ "5", PreFix + File.separator
+		+ "6", PreFix + File.separator
+		+ "7", PreFix + File.separator
+		+ "8", PreFix + File.separator
+		+ "9", PreFix + File.separator
+		+ "TwoKmer", PreFix + File.separator
+		+ "ThreeKmer", PreFix + File.separator
+		+ "SinglePath", PreFix + File.separator
+		+ "SimplePath", PreFix + File.separator
+		+ "Path", PreFix + File.separator
+		+ "BridgePath", PreFix + File.separator
+		+ "CyclePath", PreFix + File.separator
+		+ "RingPath", PreFix + File.separator
+		+ "LongPath", PreFix + File.separator
+		+ "TreePath"};
+	private static final String ACTUAL_RESULT_DIR = "actual";
+	private static final String PATH_TO_HADOOP_CONF = "src/test/resources/hadoop/conf";
+	private static final String PATH_TO_CLUSTER_STORE = "src/test/resources/cluster/stores.properties";
+	private static final String PATH_TO_CLUSTER_PROPERTIES = "src/test/resources/cluster/cluster.properties";
+	private static final String PATH_TO_JOBS = "src/test/resources/jobs/";
+	private static final String PATH_TO_ONLY = "src/test/resources/only.txt";
+
+	public static final String HDFS_INPUTPATH = "/PathTestSet";
+
+	private static final String HADOOP_CONF_PATH = ACTUAL_RESULT_DIR
+			+ File.separator + "conf.xml";
+	private MiniDFSCluster dfsCluster;
+
+	private JobConf conf = new JobConf();
+	private int numberOfNC = 2;
+
+	public void setUp() throws Exception {
+		ClusterConfig.setStorePath(PATH_TO_CLUSTER_STORE);
+		ClusterConfig.setClusterPropertiesPath(PATH_TO_CLUSTER_PROPERTIES);
+		cleanupStores();
+		PregelixHyracksIntegrationUtil.init("src/test/resources/topology.xml");
+		LOGGER.info("Hyracks mini-cluster started");
+		FileUtils.forceMkdir(new File(ACTUAL_RESULT_DIR));
+		FileUtils.cleanDirectory(new File(ACTUAL_RESULT_DIR));
+		startHDFS();
+	}
+
+	private void startHDFS() throws IOException {
+		conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/core-site.xml"));
+		conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/mapred-site.xml"));
+		conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/hdfs-site.xml"));
+		FileSystem lfs = FileSystem.getLocal(new Configuration());
+		lfs.delete(new Path("build"), true);
+		System.setProperty("hadoop.log.dir", "logs");
+		dfsCluster = new MiniDFSCluster(conf, numberOfNC, true, null);
+		FileSystem dfs = FileSystem.get(conf);
+
+		for (String testDir : TestDir) {
+			File src = new File(testDir);
+			Path dest = new Path(HDFS_INPUTPATH + File.separator + src.getName());
+			dfs.mkdirs(dest);
+			//src.listFiles()
+			//src.listFiles((FilenameFilter)(new WildcardFileFilter("part*")))
+			for (File f : src.listFiles()){
+				dfs.copyFromLocalFile(new Path(f.getAbsolutePath()), dest);
+			}
+		}
+
+		DataOutputStream confOutput = new DataOutputStream(
+				new FileOutputStream(new File(HADOOP_CONF_PATH)));
+		conf.writeXml(confOutput);
+		confOutput.flush();
+		confOutput.close();
+	}
+	
+	private void cleanupStores() throws IOException {
+		FileUtils.forceMkdir(new File("teststore"));
+		FileUtils.forceMkdir(new File("build"));
+		FileUtils.cleanDirectory(new File("teststore"));
+		FileUtils.cleanDirectory(new File("build"));
+	}
+
+	/**
+	 * cleanup hdfs cluster
+	 */
+	private void cleanupHDFS() throws Exception {
+		dfsCluster.shutdown();
+	}
+
+	public void tearDown() throws Exception {
+		PregelixHyracksIntegrationUtil.deinit();
+		LOGGER.info("Hyracks mini-cluster shut down");
+		cleanupHDFS();
+	}
+
+	public static Test suite() throws Exception {
+		List<String> onlys = getFileList(PATH_TO_ONLY);
+		File testData = new File(PATH_TO_JOBS);
+		File[] queries = testData.listFiles();
+		PathMergeSmallTestSuite testSuite = new PathMergeSmallTestSuite();
+		testSuite.setUp();
+		boolean onlyEnabled = false;
+		FileSystem dfs = FileSystem.get(testSuite.conf);
+
+		if (onlys.size() > 0) {
+			onlyEnabled = true;
+		}
+
+		for (File qFile : queries) {
+			if (qFile.isFile()) {
+				if (onlyEnabled && !isInList(onlys, qFile.getName())) {
+					continue;
+				} else {
+					for (String testPathStr : TestDir) {
+						File testDir = new File(testPathStr);
+						String resultFileName = ACTUAL_RESULT_DIR
+								+ File.separator
+								+ jobExtToResExt(qFile.getName())
+								+ File.separator + "bin"
+								+ File.separator + testDir.getName();
+						String textFileName = ACTUAL_RESULT_DIR
+								+ File.separator
+								+ jobExtToResExt(qFile.getName())
+								+ File.separator + "txt"
+								+ File.separator + testDir.getName();
+						testSuite.addTest(new PathMergeSmallTestCase(
+								HADOOP_CONF_PATH, qFile.getName(), qFile
+										.getAbsolutePath().toString(),
+								 dfs, HDFS_INPUTPATH + File.separator + testDir.getName(),
+								 resultFileName, textFileName));
+					}
+				}
+			}
+		}
+		return testSuite;
+	}
+
+	/**
+	 * Runs the tests and collects their result in a TestResult.
+	 */
+	@Override
+	public void run(TestResult result) {
+		try {
+			int testCount = countTestCases();
+			for (int i = 0; i < testCount; i++) {
+				// cleanupStores();
+				Test each = this.testAt(i);
+				if (result.shouldStop())
+					break;
+				runTest(each, result);
+			}
+			tearDown();
+		} catch (Exception e) {
+			throw new IllegalStateException(e);
+		}
+	}
+
+	protected static List<String> getFileList(String ignorePath)
+			throws FileNotFoundException, IOException {
+		BufferedReader reader = new BufferedReader(new FileReader(ignorePath));
+		String s = null;
+		List<String> ignores = new ArrayList<String>();
+		while ((s = reader.readLine()) != null) {
+			ignores.add(s);
+		}
+		reader.close();
+		return ignores;
+	}
+
+	private static String jobExtToResExt(String fname) {
+		int dot = fname.lastIndexOf('.');
+		return fname.substring(0, dot);
+	}
+
+	private static boolean isInList(List<String> onlys, String name) {
+		for (String only : onlys)
+			if (name.indexOf(only) >= 0)
+				return true;
+		return false;
+	}
+
+}
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/ResultGen/ReportGenerator.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/ResultGen/ReportGenerator.java
index 3281a3b..00298a3 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/ResultGen/ReportGenerator.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/ResultGen/ReportGenerator.java
@@ -10,8 +10,8 @@
 import org.apache.commons.io.FileUtils;
 
 public class ReportGenerator {
-	public static final String PATH_TO_REPORT = "report/";
-	public static final String PATH_TO_LOGINFO = "log/";
+	public static final String PATH_TO_REPORT = "report";
+	public static final String PATH_TO_LOGINFO = "log";
 
 	public static void generateReportFromLoginfo(String fileName) throws Exception {
 		DecimalFormat df = new DecimalFormat("0.00");
@@ -41,10 +41,10 @@
 	public static void main(String[] args) throws Exception {
 		FileUtils.forceMkdir(new File(PATH_TO_REPORT));
 		FileUtils.cleanDirectory(new File(PATH_TO_REPORT));
-		generateReportFromLoginfo("naive");
-		generateReportFromLoginfo("log");
-		generateReportFromLoginfo("log_yourkit");
+		generateReportFromLoginfo("naive_converge");
+		generateReportFromLoginfo("log_converge");
 		generateReportFromLoginfo("naive_36");
 		generateReportFromLoginfo("log_13");
+
 	}
 }
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/GraphBuildTest.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/GraphBuildTest.java
index 5681ae0..6d4e421 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/GraphBuildTest.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/GraphBuildTest.java
@@ -30,6 +30,7 @@
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.KmerCountValue;
 
+@SuppressWarnings("deprecation")
 public class GraphBuildTest {
 	private static final String ACTUAL_RESULT_DIR = "graphbuildresult";
 	private static final String PATH_TO_HADOOP_CONF = "src/test/resources/hadoop/conf";
@@ -128,14 +129,12 @@
 
 
 	private boolean checkResults(String expectedPath) throws Exception {
-		File dumped = null;
 		String format = conf.get(GenomixJob.OUTPUT_FORMAT);
 		if ("text".equalsIgnoreCase(format)) {
 			FileUtil.copyMerge(FileSystem.get(conf),
 					new Path(HDFS_OUTPUT_PATH), FileSystem
 							.getLocal(new Configuration()), new Path(
 							DUMPED_RESULT), false, conf, null);
-			dumped = new File(DUMPED_RESULT);
 		} else {
 
 			FileSystem.getLocal(new Configuration()).mkdirs(
@@ -173,7 +172,6 @@
 				reader.close();
 			}
 			bw.close();
-			dumped = new File(CONVERT_RESULT);
 		}
 
 		// TestUtils.compareWithSortedResult(new File(expectedPath), dumped);
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
index 54cecbc..afd2477 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
@@ -20,13 +20,13 @@
 public class MergePathTest {
 	public static final String PATH_TO_TESTSTORE = "testcase/pathmerge/"; 
 	//"genomix_result/pathmerge/new_naive";
-	public static final String NAIVE_DATA_INPUT = "genomix_result/pathmerge/naive_newest";//"actual/NaiveAlgorithmForMergeGraph/BinaryOutput/test";
+	public static final String NAIVE_DATA_INPUT = "genomix_result/P1_nc8";//"actual/NaiveAlgorithmForMergeGraph/BinaryOutput/test";
 	//"genomix_result/pathmerge/new_log";
-	public static final String LOG_DATA_INPUT = "genomix_result/pathmerge/log_newest";//"actual/TwoStepLogAlgorithmForMergeGraph/BinaryOutput/test";
+	public static final String LOG_DATA_INPUT = "genomix_result/P2_nc8";//"actual/TwoStepLogAlgorithmForMergeGraph/BinaryOutput/test";
 	public static final String TEXT_OUTPUT = PATH_TO_TESTSTORE + "textfile";
 	public static final String CHAIN_OUTPUT = PATH_TO_TESTSTORE + "chain";
 	
-	private static int nc = 4;
+	private static int nc = 8;
 	private static int kmerSize = 55;
 	private static int maxLength = 102; 
 	
@@ -58,18 +58,26 @@
 				if (key == null || value == null){
 					break;
 				}
-				if(value.getLengthOfMergeChain() != 0
-						&& value.getLengthOfMergeChain() != -1
-						&& value.getState() == State.FINAL_VERTEX){
+				//if(value.getState() == State.FINAL_VERTEX){
+					/*bw.write(value.getMergeChain().toString()
+							+ "\t" + GeneCode.getSymbolFromBitMap(value.getAdjMap()));
+					bw.newLine();*/
+					bw.write(key.toString()
+							+ "\t" + value.toString());
+					bw.newLine();
+				//}
+				//if(value.getLengthOfMergeChain() != 0
+				//		&& value.getLengthOfMergeChain() != -1
+				//		&& value.getState() == State.FINAL_VERTEX){
 					//bw.write(key.toString() + "\t" + 
 					//	value.toString());
-					bw.write(value.getLengthOfMergeChain() + "\t" +
-							value.getMergeChain().toString() + "\t" +
-							GeneCode.getSymbolFromBitMap(value.getAdjMap()) + "\t" +
-							value.getState());
-							//+ "\t" + key.toString());
-					bw.newLine();
-				}
+					//bw.write(value.getLengthOfMergeChain() + "\t" +
+					//		value.getMergeChain().toString() + "\t" +
+					//		GeneCode.getSymbolFromBitMap(value.getAdjMap()) + "\t" +
+					//		key.toString());
+							//value.getState());
+					
+				//}
 		    }
 		    reader.close();
 		}
diff --git a/genomix/genomix-pregelix/src/test/resources/cluster/cluster.properties b/genomix/genomix-pregelix/src/test/resources/cluster/cluster.properties
index 94eb599..0c6abd1 100644
--- a/genomix/genomix-pregelix/src/test/resources/cluster/cluster.properties
+++ b/genomix/genomix-pregelix/src/test/resources/cluster/cluster.properties
@@ -20,7 +20,7 @@
 NCLOGS_DIR=$NCTMP_DIR/logs
 
 #Comma separated I/O directories for the spilling of external sort
-IO_DIRS="/tmp/t3,/tmp/t4"
+IO_DIRS="/tmp/t3,/tmp/t4,/tmp/t5,/tmp/t6"
 
 #The JAVA_HOME
 JAVA_HOME=$JAVA_HOME
@@ -33,5 +33,5 @@
 # Yourkit option: -agentpath:/grid/0/dev/vborkar/tools/yjp-10.0.4/bin/linux-x86-64/libyjpagent.so=port=20001"
 
 #NC JAVA_OPTS
-NCJAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=7002,server=y,suspend=n -Xmx1g -Djava.util.logging.config.file=logging.properties"
+NCJAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=7002,server=y,suspend=n -Xmx3g -Djava.util.logging.config.file=genomix-pregelix/src/test/resources/logging.properties"
 
diff --git a/genomix/genomix-pregelix/src/test/resources/cluster/stores.properties b/genomix/genomix-pregelix/src/test/resources/cluster/stores.properties
index 04732be..2daf1ee 100644
--- a/genomix/genomix-pregelix/src/test/resources/cluster/stores.properties
+++ b/genomix/genomix-pregelix/src/test/resources/cluster/stores.properties
@@ -1 +1 @@
-store=teststore1,teststore2
\ No newline at end of file
+store=teststore1,teststore2,teststore3,teststore4,
\ No newline at end of file
diff --git a/genomix/genomix-pregelix/src/test/resources/logging.properties b/genomix/genomix-pregelix/src/test/resources/logging.properties
index b8f2be9..0ed3dfc 100644
--- a/genomix/genomix-pregelix/src/test/resources/logging.properties
+++ b/genomix/genomix-pregelix/src/test/resources/logging.properties
@@ -60,6 +60,7 @@
 # For example, set the com.xyz.foo logger to only log SEVERE
 # messages:
 
+edu.uci.ics.genomix.pregelix = INFO
 #edu.uci.ics.asterix.level = FINE
 #edu.uci.ics.algebricks.level = FINE
 edu.uci.ics.hyracks.level = SEVERE
