diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
index ab0f6e9..0988813 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
@@ -5,6 +5,7 @@
 import java.io.IOException;
 import java.io.Serializable;
 
+import org.apache.hadoop.io.RawComparator;
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
 
@@ -97,11 +98,15 @@
 
     @Override
     public int compareTo(PositionWritable other) {
-        int diff = this.getReadID() - other.getReadID();
-        if (diff == 0) {
-            return this.getPosInRead() - other.getPosInRead();
+        int diff1 = this.getReadID() - other.getReadID();
+        if (diff1 == 0) {
+            int diff2 = Math.abs((int) this.getPosInRead()) - Math.abs((int) other.getPosInRead());
+            if (diff2 == 0) {
+                return this.getPosInRead() - other.getPosInRead();
+            }
+            return diff2;
         }
-        return diff;
+        return diff1;
     }
 
     @Override
@@ -118,33 +123,30 @@
         public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
             int thisValue = Marshal.getInt(b1, s1);
             int thatValue = Marshal.getInt(b2, s2);
-            int diff = thisValue - thatValue;
-            int src = 0;
-            int des = 0;
-            if (diff == 0) {
-                if(b1[s1 + INTBYTES] < 0) {
-                    src = - b1[s1 + INTBYTES];}
-                if(b2[s2 + INTBYTES] < 0){
-                    des = - b2[s2 + INTBYTES];}
-                if(src == des) {
+            int diff1 = thisValue - thatValue;
+            if (diff1 == 0) {
+                int diff2 = Math.abs((int) b1[s1 + INTBYTES]) - Math.abs((int) b2[s2 + INTBYTES]);
+                if (diff2 == 0) {
                     return b1[s1 + INTBYTES] - b2[s2 + INTBYTES];
                 }
-                return src - des;
+                return diff2;
             }
-            return diff;
+            return diff1;
+            //            return compareBytes(b1, s1, l1, b2, s2, l2);
         }
     }
 
-    public static class FirstComparator extends WritableComparator {
-        public FirstComparator() {
-            super(PositionWritable.class);
+    public static class FirstComparator implements RawComparator<PositionWritable> {
+        @Override
+        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
+            return WritableComparator.compareBytes(b1, s1, l1 - 1, b2, s2, l2 - 1);
         }
 
-        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
-            int thisValue = Marshal.getInt(b1, s1);
-            int thatValue = Marshal.getInt(b2, s2);
-            int diff = thisValue - thatValue;
-            return diff;
+        @Override
+        public int compare(PositionWritable o1, PositionWritable o2) {
+            int l = o1.getReadID();
+            int r = o2.getReadID();
+            return l == r ? 0 : (l < r ? -1 : 1);
         }
     }
 
diff --git a/genomix/genomix-hadoop/data/webmap/text.txt b/genomix/genomix-hadoop/data/webmap/text.txt
index 13190dd..01c49e5 100755
--- a/genomix/genomix-hadoop/data/webmap/text.txt
+++ b/genomix/genomix-hadoop/data/webmap/text.txt
@@ -1,6 +1,6 @@
 1	AATAGAAG
-2	AATAGAAG
+2	AATAGCTT
 3	AATAGAAG
-4	AATAGAAG
+4	AATAGCTT
 5	AATAGAAG
 6	AGAAGAAG
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3.java
deleted file mode 100644
index ddb2a64..0000000
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3.java
+++ /dev/null
@@ -1,246 +0,0 @@
-package edu.uci.ics.genomix.hadoop.graphclean.mergepaths.h3;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Random;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.conf.Configured;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.io.NullWritable;
-import org.apache.hadoop.mapred.FileInputFormat;
-import org.apache.hadoop.mapred.FileOutputFormat;
-import org.apache.hadoop.mapred.JobClient;
-import org.apache.hadoop.mapred.JobConf;
-import org.apache.hadoop.mapred.MapReduceBase;
-import org.apache.hadoop.mapred.Mapper;
-import org.apache.hadoop.mapred.OutputCollector;
-import org.apache.hadoop.mapred.Reducer;
-import org.apache.hadoop.mapred.Reporter;
-import org.apache.hadoop.mapred.RunningJob;
-import org.apache.hadoop.mapred.SequenceFileInputFormat;
-import org.apache.hadoop.util.Tool;
-import org.apache.hadoop.util.ToolRunner;
-
-import edu.uci.ics.genomix.hadoop.pmcommon.MessageWritableNodeWithFlag;
-import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.PositionWritable;
-
-@SuppressWarnings("deprecation")
-public class MergePathsH3 extends Configured implements Tool {
-    /*
-     * Flags used when sending messages
-     */
-    public static class MessageFlag {
-        public static final byte EMPTY_MESSAGE = 0;
-        public static final byte FROM_SELF = 1;
-        public static final byte FROM_SUCCESSOR = 1 << 1;
-        public static final byte IS_HEAD = 1 << 2;
-        public static final byte FROM_PREDECESSOR = 1 << 3;
-
-        public static String getFlagAsString(byte code) {
-            // TODO: allow multiple flags to be set
-            switch (code) {
-                case EMPTY_MESSAGE:
-                    return "EMPTY_MESSAGE";
-                case FROM_SELF:
-                    return "FROM_SELF";
-                case FROM_SUCCESSOR:
-                    return "FROM_SUCCESSOR";
-            }
-            return "ERROR_BAD_MESSAGE";
-        }
-    }
-
-    /*
-     * Common functionality for the two mapper types needed.  See javadoc for MergePathsH3MapperSubsequent.
-     */
-    private static class MergePathsH3MapperBase extends MapReduceBase {
-
-        protected static long randSeed;
-        protected Random randGenerator;
-        protected float probBeingRandomHead;
-
-        protected int KMER_SIZE;
-        protected PositionWritable outputKey;
-        protected MessageWritableNodeWithFlag outputValue;
-        protected NodeWritable curNode;
-
-        public void configure(JobConf conf) {
-            randSeed = conf.getLong("randomSeed", 0);
-            randGenerator = new Random(randSeed);
-            probBeingRandomHead = conf.getFloat("probBeingRandomHead", 0.5f);
-
-            KMER_SIZE = conf.getInt("sizeKmer", 0);
-            outputValue = new MessageWritableNodeWithFlag(KMER_SIZE);
-            outputKey = new PositionWritable();
-            curNode = new NodeWritable(KMER_SIZE);
-        }
-
-        protected boolean isNodeRandomHead(PositionWritable nodeID) {
-            // "deterministically random", based on node id
-            randGenerator.setSeed(randSeed ^ nodeID.hashCode());
-            return randGenerator.nextFloat() < probBeingRandomHead;
-        }
-    }
-
-    /*
-     * Mapper class: Partition the graph using random pseudoheads.
-     * Heads send themselves to their successors, and all others map themselves.
-     */
-    private static class MergePathsH3MapperSubsequent extends MergePathsH3MapperBase implements
-            Mapper<PositionWritable, MessageWritableNodeWithFlag, PositionWritable, MessageWritableNodeWithFlag> {
-        @Override
-        public void map(PositionWritable key, MessageWritableNodeWithFlag value,
-                OutputCollector<PositionWritable, MessageWritableNodeWithFlag> output, Reporter reporter)
-                throws IOException {
-            curNode = value.getNode();
-            // Map all path vertices; tail nodes are sent to their predecessors
-            if (curNode.isPathNode()) {
-                boolean isHead = (value.getFlag() & MessageFlag.IS_HEAD) == MessageFlag.IS_HEAD;
-                if (isHead || isNodeRandomHead(curNode.getNodeID())) {
-                    // head nodes send themselves to their successor
-                    outputKey.set(curNode.getOutgoingList().getPosition(0));
-                    outputValue.set((byte) (MessageFlag.FROM_PREDECESSOR | MessageFlag.IS_HEAD), curNode);
-                    output.collect(outputKey, outputValue);
-                } else {
-                    // tail nodes map themselves
-                    outputValue.set(MessageFlag.FROM_SELF, curNode);
-                    output.collect(key, outputValue);
-                }
-            }
-        }
-    }
-
-    /*
-     * Mapper used for the first iteration.  See javadoc for MergePathsH3MapperSubsequent.
-     */
-    private static class MergePathsH3MapperInitial extends MergePathsH3MapperBase implements
-            Mapper<NodeWritable, NullWritable, PositionWritable, MessageWritableNodeWithFlag> {
-        @Override
-        public void map(NodeWritable key, NullWritable value,
-                OutputCollector<PositionWritable, MessageWritableNodeWithFlag> output, Reporter reporter)
-                throws IOException {
-            curNode = key;
-            // Map all path vertices; tail nodes are sent to their predecessors
-            if (curNode.isPathNode()) {
-                if (isNodeRandomHead(curNode.getNodeID())) {
-                    // head nodes send themselves to their successor
-                    outputKey.set(curNode.getOutgoingList().getPosition(0));
-                    outputValue.set((byte) (MessageFlag.FROM_PREDECESSOR | MessageFlag.IS_HEAD), curNode);
-                    output.collect(outputKey, outputValue);
-                } else {
-                    // tail nodes map themselves
-                    outputValue.set(MessageFlag.FROM_SELF, curNode);
-                    output.collect(key.getNodeID(), outputValue);
-                }
-            }
-        }
-    }
-
-    /*
-     * Reducer class: merge nodes that co-occur; for singletons, remap the original nodes 
-     */
-    private static class MergePathsH3Reducer extends MapReduceBase implements
-            Reducer<PositionWritable, MessageWritableNodeWithFlag, PositionWritable, MessageWritableNodeWithFlag> {
-
-        private int KMER_SIZE;
-        private MessageWritableNodeWithFlag inputValue;
-        private MessageWritableNodeWithFlag outputValue;
-        private NodeWritable headNode;
-        private NodeWritable tailNode;
-        private int count;
-
-        public void configure(JobConf conf) {
-            KMER_SIZE = conf.getInt("sizeKmer", 0);
-            outputValue = new MessageWritableNodeWithFlag(KMER_SIZE);
-            headNode = new NodeWritable(KMER_SIZE);
-            tailNode = new NodeWritable(KMER_SIZE);
-        }
-
-        @Override
-        public void reduce(PositionWritable key, Iterator<MessageWritableNodeWithFlag> values,
-                OutputCollector<PositionWritable, MessageWritableNodeWithFlag> output, Reporter reporter)
-                throws IOException {
-
-            inputValue = values.next();
-            if (!values.hasNext()) {
-                // all single nodes must be remapped
-                if ((inputValue.getFlag() & MessageFlag.FROM_SELF) == MessageFlag.FROM_SELF) {
-                    // FROM_SELF => remap self
-                    output.collect(key, inputValue);
-                } else {
-                    // FROM_PREDECESSOR => remap predecessor
-                    output.collect(inputValue.getNode().getNodeID(), inputValue);
-                }
-            } else {
-                // multiple inputs => a merge will take place. Aggregate both, then collect the merged path
-                count = 0;
-                while (true) { // process values; break when no more
-                    count++;
-                    if ((inputValue.getFlag() & MessageFlag.FROM_PREDECESSOR) == MessageFlag.FROM_PREDECESSOR) {
-                        headNode.set(inputValue.getNode());
-                    } else {
-                        tailNode.set(inputValue.getNode());
-                    }
-                    if (!values.hasNext()) {
-                        break;
-                    } else {
-                        inputValue = values.next();
-                    }
-                }
-                if (count != 2) {
-                    throw new IOException("Expected two nodes in MergePathsH3 reduce; saw " + String.valueOf(count));
-                }
-                // merge the head and tail as saved output, this merged node is now a head 
-                headNode.mergeNext(tailNode, KMER_SIZE);
-                outputValue.set(MessageFlag.IS_HEAD, headNode);
-                output.collect(key, outputValue);
-            }
-        }
-    }
-
-    /*
-     * Run one iteration of the mergePaths algorithm
-     */
-    public RunningJob run(String inputPath, String outputPath, JobConf baseConf) throws IOException {
-        JobConf conf = new JobConf(baseConf);
-        conf.setJarByClass(MergePathsH3.class);
-        conf.setJobName("MergePathsH3 " + inputPath);
-
-        FileInputFormat.addInputPath(conf, new Path(inputPath));
-        FileOutputFormat.setOutputPath(conf, new Path(outputPath));
-
-        conf.setInputFormat(SequenceFileInputFormat.class);
-
-        conf.setMapOutputKeyClass(PositionWritable.class);
-        conf.setMapOutputValueClass(MessageWritableNodeWithFlag.class);
-        conf.setOutputKeyClass(PositionWritable.class);
-        conf.setOutputValueClass(MessageWritableNodeWithFlag.class);
-
-        // on the first iteration, we have to transform from a node-oriented graph 
-        // to a Position-oriented graph
-        if (conf.getInt("iMerge", 1) == 1) {
-            conf.setMapperClass(MergePathsH3MapperInitial.class);
-        } else {
-            conf.setMapperClass(MergePathsH3MapperSubsequent.class);
-        }
-        conf.setReducerClass(MergePathsH3Reducer.class);
-
-        FileSystem.get(conf).delete(new Path(outputPath), true);
-
-        return JobClient.runJob(conf);
-    }
-
-    @Override
-    public int run(String[] arg0) throws Exception {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    public static void main(String[] args) throws Exception {
-        int res = ToolRunner.run(new Configuration(), new MergePathsH3(), args);
-        System.exit(res);
-    }
-}
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3Driver.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3Driver.java
deleted file mode 100644
index 4982439..0000000
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/MergePathsH3Driver.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2009-2012 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package edu.uci.ics.genomix.hadoop.graphclean.mergepaths.h3;
-
-import java.io.IOException;
-
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.mapred.JobConf;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-@SuppressWarnings("deprecation")
-public class MergePathsH3Driver {
-
-    private static class Options {
-        @Option(name = "-inputpath", usage = "the input path", required = true)
-        public String inputPath;
-
-        @Option(name = "-outputpath", usage = "the output path", required = true)
-        public String outputPath;
-
-        @Option(name = "-mergeresultpath", usage = "the merging results path", required = true)
-        public String mergeResultPath;
-
-        @Option(name = "-num-reducers", usage = "the number of reducers", required = true)
-        public int numReducers;
-
-        @Option(name = "-kmer-size", usage = "the size of kmer", required = true)
-        public int sizeKmer;
-
-        @Option(name = "-merge-rounds", usage = "the while rounds of merging", required = true)
-        public int mergeRound;
-
-    }
-
-    public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, int mergeRound)
-            throws IOException {
-        JobConf baseConf = new JobConf(); // I don't know the semantics here.  do i use a base conf file or something?
-        baseConf.setNumReduceTasks(numReducers);
-        baseConf.setInt("sizeKmer", sizeKmer);
-
-        FileSystem dfs = FileSystem.get(baseConf);
-        String prevOutput = inputPath;
-        dfs.delete(new Path(outputPath), true); // clear any previous output
-
-        String tmpOutputPath = "NO_JOBS_DONE";
-        for (int iMerge = 1; iMerge <= mergeRound; iMerge++) {
-            baseConf.setInt("iMerge", iMerge);
-            MergePathsH3 merger = new MergePathsH3();
-            tmpOutputPath = inputPath + ".mergepathsH3." + String.valueOf(iMerge);
-            merger.run(prevOutput, tmpOutputPath, baseConf);
-        }
-        dfs.rename(new Path(tmpOutputPath), new Path(outputPath)); // save final results
-    }
-
-    public static void main(String[] args) throws Exception {
-        Options options = new Options();
-        CmdLineParser parser = new CmdLineParser(options);
-        parser.parseArgument(args);
-        MergePathsH3Driver driver = new MergePathsH3Driver();
-        driver.run(options.inputPath, options.outputPath, options.numReducers, 
-                options.sizeKmer, options.mergeRound);
-    }
-}
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 013dd72..e02b4f3 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
@@ -23,7 +23,6 @@
     private static int LAST_POSID;
     private static int KMER_SIZE;
     private static int READ_LENGTH;
-
     @Override
     public void configure(JobConf job) {
         KMER_SIZE = Integer.parseInt(job.get("sizeKmer"));
@@ -71,13 +70,15 @@
             positionEntry.set(outputListInRead.getPosition(i));
             tempPosList.reset();
             for (int j = 0; j < attriListInRead.getCountOfPosition(); j++) {
-                tempVertex.set(attriListInRead.getPosition(i));
+                tempVertex.set(attriListInRead.getPosition(j));
                 if (tempVertex.getReadID() != positionEntry.getReadID()) {
                     tempPosList.append(tempVertex);
                 }
             }
             outputListAndKmer.set(tempPosList, kmer);
-            output.collect(positionEntry, outputListAndKmer);
+//            if(positionEntry.getReadID() == 1){
+                output.collect(positionEntry, outputListAndKmer);
+//            }
         }
     }
 }
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingReducer.java
index eb37c46..ec394fe 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/DeepGraphBuildingReducer.java
@@ -16,34 +16,6 @@
 @SuppressWarnings("deprecation")
 public class DeepGraphBuildingReducer extends MapReduceBase implements
         Reducer<PositionWritable, PositionListAndKmerWritable, NodeWritable, NullWritable> {
-    public class nodeToMergeState {
-        public static final byte NOT_UPDATE = 0;
-        public static final byte ASSIGNED_BY_RIGHTNODE = 1;
-        private byte state;
-
-        public nodeToMergeState() {
-            state = NOT_UPDATE;
-        }
-
-        public void setToNotUpdate() {
-            state = NOT_UPDATE;
-        }
-
-        public void setToAssignedByRightNode() {
-            state = ASSIGNED_BY_RIGHTNODE;
-        }
-
-        public String getState() {
-            switch (state) {
-                case NOT_UPDATE:
-                    return "NOT_UPDATE";
-                case ASSIGNED_BY_RIGHTNODE:
-                    return "ASSIGNED_BY_RIGHTNODE";
-            }
-            return "ERROR_STATE";
-        }
-    }
-
     private PositionListAndKmerWritable curNodePosiListAndKmer = new PositionListAndKmerWritable();
     private PositionListAndKmerWritable curNodeNegaListAndKmer = new PositionListAndKmerWritable();
     private PositionListAndKmerWritable nextNodePosiListAndKmer = new PositionListAndKmerWritable();
@@ -72,6 +44,14 @@
     public void reduce(PositionWritable key, Iterator<PositionListAndKmerWritable> values,
             OutputCollector<NodeWritable, NullWritable> output, Reporter reporter) throws IOException {
         int readID = key.getReadID();
+        if(readID == 1) {
+            int x = 4;
+            int y =x ;
+            System.out.println((int)key.getPosInRead());
+        }
+/*        while(values.hasNext()) {
+            System.out.println(values.next().getKmer().toString());
+        }*/
         byte posInRead = (byte) 1;
         resetNode(curNode, readID, posInRead);
         assembleFirstTwoNodesInRead(curNodePosiListAndKmer, nextNodePosiListAndKmer, nextNodeNegaListAndKmer,
@@ -80,67 +60,75 @@
         assembleNodeFromValues(readID, posInRead, curNodePosiListAndKmer, curNodeNegaListAndKmer,
                 nextNodePosiListAndKmer, nextNodeNegaListAndKmer, incomingList, outgoingList, curNode, nextNode, values);
         posInRead++;
-        while (values.hasNext()) {
-            assembleNodeFromValues(readID, posInRead, curNodePosiListAndKmer, curNodeNegaListAndKmer,
-                    nextNodePosiListAndKmer, nextNodeNegaListAndKmer, incomingList, outgoingList, curNode, nextNextNode, values);
+        boolean flag = true;
+        while (flag) {
+            flag = assembleNodeFromValues(readID, posInRead, curNodePosiListAndKmer, curNodeNegaListAndKmer,
+                    nextNodePosiListAndKmer, nextNodeNegaListAndKmer, incomingList, outgoingList, nextNode,
+                    nextNextNode, values);
             posInRead++;
             if (curNode.inDegree() > 1 || curNode.outDegree() > 0 || nextNode.inDegree() > 0
                     || nextNode.outDegree() > 0 || nextNextNode.inDegree() > 0 || nextNextNode.outDegree() > 0) {
-                connect(curNode, nextNextNode);
+                connect(curNode, nextNode);
                 output.collect(curNode, nullWritable);
                 curNode.set(nextNode);
-                nextNode.set(nextNode);
+                nextNode.set(nextNextNode);
                 continue;
             }
             curNode.mergeForwadNext(nextNode, KMER_SIZE);
             nextNode.set(nextNextNode);
         }
+        output.collect(curNode, nullWritable);
     }
 
-    public void assembleNodeFromValues(int readID, byte posInRead, PositionListAndKmerWritable curNodePosiListAndKmer,
+    public boolean assembleNodeFromValues(int readID, byte posInRead, PositionListAndKmerWritable curNodePosiListAndKmer,
             PositionListAndKmerWritable curNodeNegaListAndKmer, PositionListAndKmerWritable nextNodePosiListAndKmer,
             PositionListAndKmerWritable nextNodeNegaListAndKmer, PositionListWritable outgoingList,
             PositionListWritable incomingList, NodeWritable curNode, NodeWritable nextNode,
             Iterator<PositionListAndKmerWritable> values) throws IOException {
-
+        boolean flag = true;
         curNodePosiListAndKmer.set(nextNodePosiListAndKmer);
         curNodeNegaListAndKmer.set(nextNodeNegaListAndKmer);
         if (values.hasNext()) {
-            nextNodePosiListAndKmer.set(values.next());
+            nextNodeNegaListAndKmer.set(values.next());
             if (values.hasNext()) {
-                nextNodeNegaListAndKmer.set(values.next());
+                nextNodePosiListAndKmer.set(values.next());
             } else {
-                throw new IOException("lose the paired kmer");
+                throw new IOException("lose the paired kmer from values");
+            }
+            outgoingList.reset();
+            outgoingList.set(nextNodePosiListAndKmer.getVertexIDList());
+            setForwardOutgoingList(curNode, outgoingList);
+
+            resetNode(nextNode, readID, posInRead);
+            nextNode.setKmer(nextNodePosiListAndKmer.getKmer());
+
+            outgoingList.reset();
+            outgoingList.set(curNodeNegaListAndKmer.getVertexIDList());
+            setReverseOutgoingList(nextNode, outgoingList);
+
+            if (nextNode.getNodeID().getPosInRead() == LAST_POSID) {
+                incomingList.reset();
+                incomingList.set(nextNodeNegaListAndKmer.getVertexIDList());
+                setReverseIncomingList(nextNode, incomingList);
             }
         }
-
-        outgoingList.reset();
-        outgoingList.set(nextNodePosiListAndKmer.getVertexIDList());
-        setForwardOutgoingList(curNode, outgoingList);
-
-        resetNode(nextNode, readID, posInRead);
-        nextNode.setKmer(nextNodePosiListAndKmer.getKmer());
-
-        outgoingList.reset();
-        outgoingList.set(curNodeNegaListAndKmer.getVertexIDList());
-        setReverseOutgoingList(nextNode, outgoingList);
-
-        if (nextNode.getNodeID().getPosInRead() == LAST_POSID) {
-            incomingList.reset();
-            incomingList.set(nextNodeNegaListAndKmer.getVertexIDList());
-            setReverseIncomingList(nextNode, incomingList);
+        else{
+            flag = false;
+            resetNode(nextNode, readID, (byte)0);
         }
+        return flag;
     }
 
     public void assembleFirstTwoNodesInRead(PositionListAndKmerWritable curNodePosiListAndKmer,
             PositionListAndKmerWritable nextNodePosiListAndKmer, PositionListAndKmerWritable nextNodeNegaListAndKmer,
             PositionListWritable outgoingList, PositionListWritable incomingList, NodeWritable curNode,
             NodeWritable nextNode, Iterator<PositionListAndKmerWritable> values) throws IOException {
-        nextNodePosiListAndKmer.set(values.next());
+        nextNodeNegaListAndKmer.set(values.next());
         if (values.hasNext()) {
-            nextNodeNegaListAndKmer.set(values.next());
+            nextNodePosiListAndKmer.set(values.next());
         } else {
-            throw new IOException("lose the paired kmer");
+            System.out.println(curNode.getNodeID().getReadID());
+            throw new IOException("lose the paired kmer from first two nodes");
         }
 
         if (curNode.getNodeID().getPosInRead() == LAST_POSID) {
@@ -151,7 +139,8 @@
         incomingList.reset();
         incomingList.set(nextNodePosiListAndKmer.getVertexIDList());
 
-        curNode.setKmer(curNodePosiListAndKmer.getKmer());
+        
+        curNode.setKmer(nextNodePosiListAndKmer.getKmer());
         setForwardIncomingList(curNode, incomingList);
     }
 
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 4726380..1c68114 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
@@ -38,6 +38,9 @@
 
         @Option(name = "-kmer-size", usage = "the size of kmer", required = true)
         public int sizeKmer;
+        
+        @Option(name = "-read-length", usage = "the length of read", required = true)
+        public int readLength;
 
         @Option(name = "-onlytest1stjob", usage = "test", required = true)
         public boolean onlyTest1stJob;
@@ -46,17 +49,17 @@
         public boolean seqOutput;
     }
 
-    public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, boolean onlyTest1stJob,
+    public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, int readLength, boolean onlyTest1stJob,
             boolean seqOutput, String defaultConfPath) throws IOException {
         if (onlyTest1stJob == true) {
-            runfirstjob(inputPath, numReducers, sizeKmer, seqOutput, defaultConfPath);
+            runfirstjob(inputPath, numReducers, sizeKmer, readLength, seqOutput, defaultConfPath);
         } else {
-            runfirstjob(inputPath, numReducers, sizeKmer, true, defaultConfPath);
-            runsecondjob(inputPath, outputPath, numReducers, sizeKmer, seqOutput, defaultConfPath);
+            runfirstjob(inputPath, 2, sizeKmer, readLength, true, defaultConfPath);
+            runsecondjob(inputPath, outputPath, numReducers, sizeKmer, readLength, seqOutput, defaultConfPath);
         }
     }
 
-    public void runfirstjob(String inputPath, int numReducers, int sizeKmer, boolean seqOutput, String defaultConfPath)
+    public void runfirstjob(String inputPath, int numReducers, int sizeKmer, int readLength, boolean seqOutput, String defaultConfPath)
             throws IOException {
         JobConf conf = new JobConf(GraphBuildingDriver.class);
         conf.setInt("sizeKmer", sizeKmer);
@@ -90,14 +93,16 @@
         JobClient.runJob(conf);
     }
 
-    public void runsecondjob(String inputPath, String outputPath, int numReducers, int sizeKmer, boolean seqOutput,
+    public void runsecondjob(String inputPath, String outputPath, int numReducers, int sizeKmer, int readLength, 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.setInt("sizeKmer", sizeKmer);
+        conf.setInt("readLength", readLength);
+        
         conf.setMapperClass(DeepGraphBuildingMapper.class);
         conf.setReducerClass(DeepGraphBuildingReducer.class);
 
@@ -106,9 +111,9 @@
 
         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);
         if (seqOutput == true)
             conf.setOutputFormat(SequenceFileOutputFormat.class);
@@ -136,7 +141,7 @@
         CmdLineParser parser = new CmdLineParser(options);
         parser.parseArgument(args);
         GraphBuildingDriver driver = new GraphBuildingDriver();
-        driver.run(options.inputPath, options.outputPath, options.numReducers, options.sizeKmer,
+        driver.run(options.inputPath, options.outputPath, options.numReducers, options.sizeKmer, options.readLength,
                 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 e78e921..a44dcd2 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
@@ -37,6 +37,10 @@
         }
         int readID = 0;
         readID = Integer.parseInt(rawLine[0]);
+        if(readID == 6) {
+            int  x = 4;
+            int y = x;
+        }
         String geneLine = rawLine[1];
         byte[] array = geneLine.getBytes();
         if (KMER_SIZE >= array.length) {
@@ -54,10 +58,11 @@
         /** reverse first kmer */
         outputKmer.setByReadReverse(array, 0);
         outputVertexID.set(readID, (byte) -1);
+        output.collect(outputKmer, outputVertexID);
         /** reverse middle kmer */
         for (int i = KMER_SIZE; i < array.length; i++) {
             outputKmer.shiftKmerWithPreCode(GeneCode.getPairedCodeFromSymbol(array[i]));
-            outputVertexID.set(readID, (byte) (-2 + KMER_SIZE - i));
+            outputVertexID.set(readID, (byte)(KMER_SIZE - i - 2));
             output.collect(outputKmer, outputVertexID);
         }
     }
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingReducer.java
index d2b6476..beba5ad 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/GraphInvertedIndexBuildingReducer.java
@@ -19,6 +19,10 @@
     public void reduce(KmerBytesWritable key, Iterator<PositionWritable> values,
             OutputCollector<KmerBytesWritable, PositionListWritable> output, Reporter reporter) throws IOException {
         outputlist.reset();
+        if(key.toString().equals("CTTCT")) {
+            int x = 4;
+            int y = x;
+        }
         while (values.hasNext()) {
             outputlist.append(values.next());
         }
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/ReadIDPartitioner.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/ReadIDPartitioner.java
index 362ebf3..682e8d4 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/ReadIDPartitioner.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/velvetgraphbuilding/ReadIDPartitioner.java
@@ -6,10 +6,10 @@
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 
-public class ReadIDPartitioner implements Partitioner<PositionWritable, PositionListWritable>{
+public class ReadIDPartitioner implements Partitioner<PositionWritable, PositionListAndKmerWritable>{
     
     @Override
-    public  int getPartition(PositionWritable key, PositionListWritable value, int numPartitions){
+    public  int getPartition(PositionWritable key, PositionListAndKmerWritable value, int numPartitions){
         return (key.getReadID() & Integer.MAX_VALUE) % numPartitions;
     }
 
diff --git a/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/TestPathMergeH3.java b/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/TestPathMergeH3.java
deleted file mode 100644
index d8d4429..0000000
--- a/genomix/genomix-hadoop/src/test/java/edu/uci/ics/genomix/hadoop/graphclean/mergepaths/h3/TestPathMergeH3.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package edu.uci.ics.genomix.hadoop.graphclean.mergepaths.h3;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.io.NullWritable;
-import org.apache.hadoop.mapred.FileInputFormat;
-import org.apache.hadoop.mapred.FileOutputFormat;
-import org.junit.Test;
-
-import edu.uci.ics.genomix.hadoop.pmcommon.GenomixMiniClusterTest;
-import edu.uci.ics.genomix.hyracks.driver.Driver.Plan;
-import edu.uci.ics.genomix.hyracks.job.GenomixJobConf;
-import edu.uci.ics.genomix.type.NodeWritable;
-
-@SuppressWarnings("deprecation")
-public class TestPathMergeH3 extends GenomixMiniClusterTest {
-    protected String LOCAL_SEQUENCE_FILE = "src/test/resources/data/webmap/text.txt";
-    protected String HDFS_SEQUENCE = "/00-sequence/";
-    protected String HDFS_GRAPHBUILD = "/01-graphbuild/";
-    protected String HDFS_MERGED = "/02-graphmerge/";
-    
-    protected String GRAPHBUILD_FILE = "result.graphbuild.txt";
-    protected String PATHMERGE_FILE = "result.mergepath.txt";
-    
-    {
-        KMER_LENGTH = 5;
-        READ_LENGTH = 8;
-        HDFS_PATHS = new ArrayList<String>(Arrays.asList(HDFS_SEQUENCE, HDFS_GRAPHBUILD, HDFS_MERGED));
-        // we have to specify what kind of keys and values this job has
-        key = new NodeWritable(KMER_LENGTH);
-        value = NullWritable.get();
-    }
-
-    @Test
-    public void TestBuildGraph() throws Exception {
-        cleanUpOutput();
-        copyLocalToDFS(LOCAL_SEQUENCE_FILE, HDFS_SEQUENCE);
-        buildGraph();
-    }
-
-//    @Test
-    public void TestMergeOneIteration() throws Exception {
-        cleanUpOutput();
-        copyLocalToDFS(LOCAL_SEQUENCE_FILE, HDFS_SEQUENCE);
-        buildGraph();
-        MergePathsH3Driver h3 = new MergePathsH3Driver();
-        h3.run(HDFS_GRAPHBUILD, HDFS_MERGED, 2, KMER_LENGTH, 1, ACTUAL_ROOT + "conf.xml", null);
-        copyResultsToLocal(HDFS_MERGED, ACTUAL_ROOT + PATHMERGE_FILE, conf);
-    }
-
-
-
-    public void buildGraph() throws Exception {
-        FileInputFormat.setInputPaths(conf, HDFS_SEQUENCE);
-        FileOutputFormat.setOutputPath(conf, new Path(HDFS_GRAPHBUILD));
-        conf.set(GenomixJobConf.OUTPUT_FORMAT, GenomixJobConf.OUTPUT_FORMAT_BINARY);
-        conf.set(GenomixJobConf.GROUPBY_TYPE, GenomixJobConf.GROUPBY_TYPE_PRECLUSTER);
-        driver.runJob(new GenomixJobConf(conf), Plan.BUILD_DEBRUJIN_GRAPH, true);
-        copyResultsToLocal(HDFS_GRAPHBUILD, ACTUAL_ROOT + GRAPHBUILD_FILE, conf);
-    }
-}
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
index cc24133..871b094 100644
--- 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
@@ -29,10 +29,12 @@
     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 String EXPECTED_PATH = "expected/";
+    private static final int COUNT_REDUCER = 2;
     private static final int SIZE_KMER = 5;
+    private static final int READ_LENGTH = 8;
     private static final String GRAPHVIZ = "Graphviz";
+    private static final String EXPECTED_OUPUT_KMER = EXPECTED_PATH + "result_after_kmerAggregate";
     
     private MiniDFSCluster dfsCluster;
     private MiniMRCluster mrCluster;
@@ -45,8 +47,8 @@
         FileUtils.cleanDirectory(new File(ACTUAL_RESULT_DIR));
         startHadoop();
 //        TestGroupbyKmer();
-        TestMapKmerToRead();
-
+//        TestMapKmerToRead();
+        TestGroupByReadID();
 /*        SequenceFile.Reader reader = null;
         Path path = new Path(RESULT_PATH + "/part-00000");
         reader = new SequenceFile.Reader(dfs, path, conf); 
@@ -92,19 +94,21 @@
 
     public void TestGroupbyKmer() throws Exception {
         GraphBuildingDriver tldriver = new GraphBuildingDriver();
-        tldriver.run(HDFS_PATH, RESULT_PATH, COUNT_REDUCER, SIZE_KMER, true, false, HADOOP_CONF_PATH);
+        tldriver.run(HDFS_PATH, RESULT_PATH, COUNT_REDUCER, SIZE_KMER, READ_LENGTH, true, false, HADOOP_CONF_PATH);
         dumpGroupByKmerResult();
-        TestUtils.compareWithResult(new File(ACTUAL_RESULT_DIR + HDFS_PATH + "-step1" + "/part-00000"), new File(EXPECTED_PATH));
+//        TestUtils.compareWithResult(new File(ACTUAL_RESULT_DIR + HDFS_PATH + "-step1" + "/part-00000"), new File(EXPECTED_OUPUT_KMER));
     }
 
     public void TestMapKmerToRead() throws Exception {
         GraphBuildingDriver tldriver = new GraphBuildingDriver();
-        tldriver.run(HDFS_PATH, RESULT_PATH, COUNT_REDUCER, SIZE_KMER, false, false, HADOOP_CONF_PATH);
+        tldriver.run(HDFS_PATH, RESULT_PATH, 0, SIZE_KMER, READ_LENGTH, false, false, HADOOP_CONF_PATH);
         dumpResult();
     }
 
     public void TestGroupByReadID() throws Exception {
-        
+        GraphBuildingDriver tldriver = new GraphBuildingDriver();
+        tldriver.run(HDFS_PATH, RESULT_PATH, 2, SIZE_KMER, READ_LENGTH, false, false, HADOOP_CONF_PATH);
+        dumpResult();
     }
     
     private void startHadoop() throws IOException {
