diff --git a/genomix/genomix-hadoop/data/webmap/Test.txt b/genomix/genomix-hadoop/data/webmap/Test.txt
deleted file mode 100755
index 6d02b25..0000000
--- a/genomix/genomix-hadoop/data/webmap/Test.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-@625E1AAXX100810:1:100:10000:10271/1
-AGCATCGCA
-+
-EDBDB?BEEEDGGEGGGDGGGA>DG@GGD;GD@DG@F?<B<BFFD?
-@625E1AAXX100810:1:100:10000:10271/1
-TGCATCGCT
-+
-EDBDB?BEEEDGGEGGGDGGGA>DG@GGD;GD@DG@F?<B<BFFD?
-
-
diff --git a/genomix/genomix-hadoop/data/webmap/text.txt b/genomix/genomix-hadoop/data/webmap/text.txt
new file mode 100755
index 0000000..13190dd
--- /dev/null
+++ b/genomix/genomix-hadoop/data/webmap/text.txt
@@ -0,0 +1,6 @@
+1	AATAGAAG
+2	AATAGAAG
+3	AATAGAAG
+4	AATAGAAG
+5	AATAGAAG
+6	AGAAGAAG
diff --git a/genomix/genomix-hadoop/expected/result1 b/genomix/genomix-hadoop/expected/result1
deleted file mode 100644
index ba52008..0000000
--- a/genomix/genomix-hadoop/expected/result1
+++ /dev/null
@@ -1,8 +0,0 @@
-GCA	ACT|T	3
-AGC	|A	1
-CGC	T|AT	2
-TGC	|A	1
-ATC	C|G	2
-TCG	A|C	2
-CAT	G|C	2
-GCT	C|	1
diff --git a/genomix/genomix-hadoop/expected/result2 b/genomix/genomix-hadoop/expected/result2
deleted file mode 100755
index db55a38..0000000
--- a/genomix/genomix-hadoop/expected/result2
+++ /dev/null
@@ -1,8 +0,0 @@
-GCA	-72
-AGC	1
-CGC	-119
-TGC	1
-ATC	36
-TCG	18
-CAT	66
-GCT	32
diff --git a/genomix/genomix-hadoop/expected/result3 b/genomix/genomix-hadoop/expected/result3
deleted file mode 100644
index 0c95da0..0000000
--- a/genomix/genomix-hadoop/expected/result3
+++ /dev/null
@@ -1 +0,0 @@
-CATCG	66	-127
diff --git a/genomix/genomix-hadoop/expected/result4 b/genomix/genomix-hadoop/expected/result4
deleted file mode 100644
index 0c95da0..0000000
--- a/genomix/genomix-hadoop/expected/result4
+++ /dev/null
@@ -1 +0,0 @@
-CATCG	66	-127
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingMapper.java
index c3c252a..ccbabd7 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingMapper.java
@@ -1,7 +1,6 @@
 package edu.uci.ics.genomix.hadoop.velvetgraphbuilding;
 
 import java.io.IOException;
-import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.mapred.JobConf;
 import org.apache.hadoop.mapred.MapReduceBase;
 import org.apache.hadoop.mapred.Mapper;
@@ -33,10 +32,15 @@
     @Override
     public void map(KmerBytesWritable key, PositionListWritable value, OutputCollector<PositionWritable, PositionListAndKmerWritable> output,
             Reporter reporter) throws IOException {
+        if(key.toString().equals("AGAAG")) {
+            int y = 4;
+            int x = y;
+        }
         listPosZeroInRead.reset();
         listPosNonZeroInRead.reset();
         outputListAndKmer.reset();
-        for(int i = 0; i < value.getLength(); i++) {
+        System.out.println(value.getLength());
+        for(int i = 0; i < value.getCountOfPosition(); i++) {
             VertexID.set(value.getPosition(i));
             if(VertexID.getPosInRead() == 0) {
                 listPosZeroInRead.append(VertexID);
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphBuildingDriver.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphBuildingDriver.java
index acbc3f1..4726380 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphBuildingDriver.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphBuildingDriver.java
@@ -39,11 +39,25 @@
         @Option(name = "-kmer-size", usage = "the size of kmer", required = true)
         public int sizeKmer;
 
-    }
-   
-    public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, String defaultConfPath)
-            throws IOException {
+        @Option(name = "-onlytest1stjob", usage = "test", required = true)
+        public boolean onlyTest1stJob;
 
+        @Option(name = "-seq-output", usage = "sequence ouput format", required = true)
+        public boolean seqOutput;
+    }
+
+    public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, boolean onlyTest1stJob,
+            boolean seqOutput, String defaultConfPath) throws IOException {
+        if (onlyTest1stJob == true) {
+            runfirstjob(inputPath, numReducers, sizeKmer, seqOutput, defaultConfPath);
+        } else {
+            runfirstjob(inputPath, numReducers, sizeKmer, true, defaultConfPath);
+            runsecondjob(inputPath, outputPath, numReducers, sizeKmer, seqOutput, defaultConfPath);
+        }
+    }
+
+    public void runfirstjob(String inputPath, int numReducers, int sizeKmer, boolean seqOutput, String defaultConfPath)
+            throws IOException {
         JobConf conf = new JobConf(GraphBuildingDriver.class);
         conf.setInt("sizeKmer", sizeKmer);
         if (defaultConfPath != null) {
@@ -58,46 +72,61 @@
         conf.setMapOutputValueClass(PositionWritable.class);
 
         conf.setInputFormat(TextInputFormat.class);
-        conf.setOutputFormat(SequenceFileOutputFormat.class);
-        
+        if (seqOutput == true)
+            conf.setOutputFormat(SequenceFileOutputFormat.class);
+        else
+            conf.setOutputFormat(TextOutputFormat.class);
+
         conf.setOutputKeyClass(KmerBytesWritable.class);
         conf.setOutputValueClass(PositionListWritable.class);
-        
+
         FileInputFormat.setInputPaths(conf, new Path(inputPath));
         FileOutputFormat.setOutputPath(conf, new Path(inputPath + "-step1"));
-        conf.setNumReduceTasks(numReducers);
+        if(numReducers == 0)
+        conf.setNumReduceTasks(numReducers + 2);
 
         FileSystem dfs = FileSystem.get(conf);
         dfs.delete(new Path(inputPath + "-step1"), true);
         JobClient.runJob(conf);
-        
-        //-------------
-        conf = new JobConf(GraphBuildingDriver.class);
+    }
+
+    public void runsecondjob(String inputPath, String outputPath, int numReducers, int sizeKmer, boolean seqOutput,
+            String defaultConfPath) throws IOException {
+        JobConf conf = new JobConf(GraphBuildingDriver.class);
         if (defaultConfPath != null) {
             conf.addResource(new Path(defaultConfPath));
         }
         conf.setJobName("deep build");
-        
+
         conf.setMapperClass(DeepGraphBuildingMapper.class);
         conf.setReducerClass(DeepGraphBuildingReducer.class);
-        
+
         conf.setMapOutputKeyClass(PositionWritable.class);
         conf.setMapOutputValueClass(PositionListAndKmerWritable.class);
-        
+
         conf.setPartitionerClass(ReadIDPartitioner.class);
-        
-        conf.setOutputKeyComparatorClass(PositionWritable.Comparator.class);
-        conf.setOutputValueGroupingComparator(PositionWritable.FirstComparator.class);
-        
+
+ //       conf.setOutputKeyComparatorClass(PositionWritable.Comparator.class);
+ //       conf.setOutputValueGroupingComparator(PositionWritable.FirstComparator.class);
+
         conf.setInputFormat(SequenceFileInputFormat.class);
-        conf.setOutputFormat(TextOutputFormat.class);
+        if (seqOutput == true)
+            conf.setOutputFormat(SequenceFileOutputFormat.class);
+        else
+            conf.setOutputFormat(TextOutputFormat.class);
         
-        conf.setOutputKeyClass(NodeWritable.class);
-        conf.setOutputValueClass(NullWritable.class);
-        
+        if (numReducers != 0) {
+            conf.setOutputKeyClass(NodeWritable.class);
+            conf.setOutputValueClass(NullWritable.class);
+        } else {
+            conf.setOutputKeyClass(PositionWritable.class);
+            conf.setOutputValueClass(PositionListAndKmerWritable.class);
+        }
+
         FileInputFormat.setInputPaths(conf, new Path(inputPath + "-step1"));
         FileOutputFormat.setOutputPath(conf, new Path(outputPath));
-        conf.setNumReduceTasks(1);
+        conf.setNumReduceTasks(numReducers);
+        FileSystem dfs = FileSystem.get(conf);
         dfs.delete(new Path(outputPath), true);
         JobClient.runJob(conf);
     }
@@ -107,6 +136,7 @@
         CmdLineParser parser = new CmdLineParser(options);
         parser.parseArgument(args);
         GraphBuildingDriver driver = new GraphBuildingDriver();
-        driver.run(options.inputPath, options.outputPath, options.numReducers, options.sizeKmer, null);
+        driver.run(options.inputPath, options.outputPath, options.numReducers, options.sizeKmer,
+                options.onlyTest1stJob, options.seqOutput, null);
     }
 }
\ No newline at end of file
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingMapper.java
index d5924c8..9592a59 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingMapper.java
@@ -15,7 +15,7 @@
 @SuppressWarnings("deprecation")
 public class GraphInvertedIndexBuildingMapper extends MapReduceBase implements
         Mapper<LongWritable, Text, KmerBytesWritable, PositionWritable> {
-    
+
     public static int KMER_SIZE;
     public PositionWritable outputVertexID;
     public KmerBytesWritable outputKmer;
@@ -26,22 +26,26 @@
         outputVertexID = new PositionWritable();
         outputKmer = new KmerBytesWritable(KMER_SIZE);
     }
+
     @Override
     public void map(LongWritable key, Text value, OutputCollector<KmerBytesWritable, PositionWritable> output,
             Reporter reporter) throws IOException {
-        String geneLine = value.toString();
         /** first kmer */
+        String[] rawLine = value.toString().split("\\t"); // Read the Real Gene Line
+        if (rawLine.length != 2) {
+            throw new IOException("invalid data");
+        }
+        int readID = 0;
+        readID = Integer.parseInt(rawLine[0]);
+        String geneLine = rawLine[1];
         byte[] array = geneLine.getBytes();
         outputKmer.setByRead(array, 0);
-        System.out.println(key.get());
-        outputVertexID.set((int)key.get(), (byte)0);
+        outputVertexID.set(readID, (byte) 0);
         output.collect(outputKmer, outputVertexID);
         /** middle kmer */
-        int i = 0; 
-        for (i = KMER_SIZE; i < array.length; i++) {
+        for (int i = KMER_SIZE; i < array.length; i++) {
             outputKmer.shiftKmerWithNextChar(array[i]);
-            System.out.println((int)key.get());
-            outputVertexID.set((int)key.get(), (byte)(i - KMER_SIZE + 1));
+            outputVertexID.set(readID, (byte) (i - KMER_SIZE + 1));
             output.collect(outputKmer, outputVertexID);
         }
     }
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/PositionListAndKmerWritable.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/PositionListAndKmerWritable.java
index fff3faf..9becd58 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/PositionListAndKmerWritable.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/PositionListAndKmerWritable.java
@@ -60,6 +60,7 @@
         this.vertexIDList.set(list);
         this.kmer.set(kmer);
     }
+    
     @Override
     public void readFields(DataInput in) throws IOException {
         this.countOfKmer = in.readInt();
@@ -78,4 +79,8 @@
     public int compareTo(PositionListAndKmerWritable o) {
         return 0;
     }
+    
+    public String toString() {
+        return vertexIDList.toString() + "\t" + kmer.toString();
+    }
 }
diff --git a/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/NewGraphBuildingTest.java b/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/NewGraphBuildingTest.java
new file mode 100644
index 0000000..cc24133
--- /dev/null
+++ b/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/NewGraphBuildingTest.java
@@ -0,0 +1,145 @@
+package edu.uci.ics.genomix.hadoop.velvetgraphbuilding;
+
+import java.io.BufferedWriter;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import junit.framework.Assert;
+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.io.SequenceFile;
+import org.apache.hadoop.mapred.JobConf;
+import org.apache.hadoop.mapred.MiniMRCluster;
+import org.apache.hadoop.util.ReflectionUtils;
+import org.junit.Test;
+
+import edu.uci.ics.genomix.hadoop.utils.TestUtils;
+@SuppressWarnings("deprecation")
+
+public class NewGraphBuildingTest {
+    
+    private JobConf conf = new JobConf();
+    private static final String ACTUAL_RESULT_DIR = "actual1";
+    private static final String HADOOP_CONF_PATH = ACTUAL_RESULT_DIR + File.separator + "conf.xml";
+    private static final String DATA_PATH = "data/webmap/text.txt";
+    private static final String HDFS_PATH = "/webmap";
+    private static final String RESULT_PATH = "/result1";
+    private static final String EXPECTED_PATH = "expected/result_after_kmerAggregate";
+    private static final int COUNT_REDUCER = 0;
+    private static final int SIZE_KMER = 5;
+    private static final String GRAPHVIZ = "Graphviz";
+    
+    private MiniDFSCluster dfsCluster;
+    private MiniMRCluster mrCluster;
+    private FileSystem dfs;
+
+    @SuppressWarnings("resource")
+    @Test
+    public void test() throws Exception {
+        FileUtils.forceMkdir(new File(ACTUAL_RESULT_DIR));
+        FileUtils.cleanDirectory(new File(ACTUAL_RESULT_DIR));
+        startHadoop();
+//        TestGroupbyKmer();
+        TestMapKmerToRead();
+
+/*        SequenceFile.Reader reader = null;
+        Path path = new Path(RESULT_PATH + "/part-00000");
+        reader = new SequenceFile.Reader(dfs, path, conf); 
+        KmerBytesWritable key = new KmerBytesWritable(SIZE_KMER);
+        KmerCountValue value = (KmerCountValue) ReflectionUtils.newInstance(reader.getValueClass(), conf);
+        File filePathTo = new File(TEST_SOURCE_DIR);
+        FileUtils.forceMkdir(filePathTo);
+        FileUtils.cleanDirectory(filePathTo);
+        BufferedWriter bw = new BufferedWriter(new FileWriter(new File(TEST_SOURCE_DIR + "/comparesource.txt")));
+        File GraphViz = new File(GRAPHVIZ);
+        FileUtils.forceMkdir(GraphViz);
+        FileUtils.cleanDirectory(GraphViz);
+        BufferedWriter bw2 = new BufferedWriter(new FileWriter(new File(GRAPHVIZ + "/GenomixSource.txt")));
+        
+        while (reader.next(key, value)) {
+            byte succeed = (byte) 0x0F;
+            byte adjBitMap = value.getAdjBitMap();
+            succeed = (byte) (succeed & adjBitMap);
+            byte shiftedCode = 0;
+            for(int i = 0 ; i < 4; i ++){
+                byte temp = 0x01;
+                temp  = (byte)(temp << i);
+                temp = (byte) (succeed & temp);
+                if(temp != 0 ){
+                    bw2.write(key.toString());
+                    bw2.newLine();                    
+                    byte succeedCode = GeneCode.getGeneCodeFromBitMap(temp);
+                    shiftedCode = key.shiftKmerWithNextCode(succeedCode);
+                    bw2.write(key.toString());
+                    bw2.newLine();
+                    key.shiftKmerWithPreCode(shiftedCode);
+                }
+            }
+            bw.write(key.toString() + "\t" + value.toString());
+            bw.newLine();            
+        }
+       bw2.close();
+       bw.close();*/
+
+        cleanupHadoop();
+
+    }
+
+    public void TestGroupbyKmer() throws Exception {
+        GraphBuildingDriver tldriver = new GraphBuildingDriver();
+        tldriver.run(HDFS_PATH, RESULT_PATH, COUNT_REDUCER, SIZE_KMER, true, false, HADOOP_CONF_PATH);
+        dumpGroupByKmerResult();
+        TestUtils.compareWithResult(new File(ACTUAL_RESULT_DIR + HDFS_PATH + "-step1" + "/part-00000"), new File(EXPECTED_PATH));
+    }
+
+    public void TestMapKmerToRead() throws Exception {
+        GraphBuildingDriver tldriver = new GraphBuildingDriver();
+        tldriver.run(HDFS_PATH, RESULT_PATH, COUNT_REDUCER, SIZE_KMER, false, false, HADOOP_CONF_PATH);
+        dumpResult();
+    }
+
+    public void TestGroupByReadID() throws Exception {
+        
+    }
+    
+    private void startHadoop() throws IOException {
+        FileSystem lfs = FileSystem.getLocal(new Configuration());
+        lfs.delete(new Path("build"), true);
+        System.setProperty("hadoop.log.dir", "logs");
+        dfsCluster = new MiniDFSCluster(conf, 2, true, null);
+        dfs = dfsCluster.getFileSystem();
+        mrCluster = new MiniMRCluster(4, dfs.getUri().toString(), 2);
+
+        Path src = new Path(DATA_PATH);
+        Path dest = new Path(HDFS_PATH + "/");
+        dfs.mkdirs(dest);
+        dfs.copyFromLocalFile(src, dest);
+
+        DataOutputStream confOutput = new DataOutputStream(new FileOutputStream(new File(HADOOP_CONF_PATH)));
+        conf.writeXml(confOutput);
+        confOutput.flush();
+        confOutput.close();
+    }
+
+    private void cleanupHadoop() throws IOException {
+        mrCluster.shutdown();
+        dfsCluster.shutdown();
+    }
+
+    private void dumpGroupByKmerResult() throws IOException {
+        Path src = new Path(HDFS_PATH + "-step1");
+        Path dest = new Path(ACTUAL_RESULT_DIR);
+        dfs.copyToLocalFile(src, dest);
+    }
+    
+    private void dumpResult() throws IOException {
+        Path src = new Path(RESULT_PATH);
+        Path dest = new Path(ACTUAL_RESULT_DIR);
+        dfs.copyToLocalFile(src, dest);
+    }
+}
