diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
index 2880b6c..2f463a4 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
@@ -2,11 +2,25 @@
 
 import java.io.IOException;
 
-import org.apache.commons.cli.Options;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+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.SequenceFileOutputFormat;
+import org.apache.hadoop.mapred.TextInputFormat;
 import org.kohsuke.args4j.CmdLineParser;
 import org.kohsuke.args4j.Option;
 
+import edu.uci.ics.genomix.hadoop.graphbuilding.GenomixCombiner;
+import edu.uci.ics.genomix.hadoop.graphbuilding.GenomixMapper;
+import edu.uci.ics.genomix.hadoop.graphbuilding.GenomixReducer;
+import edu.uci.ics.genomix.hadoop.oldtype.KmerBytesWritable;
+import edu.uci.ics.genomix.hadoop.oldtype.KmerCountValue;
 
+
+@SuppressWarnings("deprecation")
 public class GenomixDriver {
     
     private static class Options {
@@ -27,7 +41,29 @@
     }
     
     public void run(String inputPath, String outputPath, int numReducers, int sizeKmer, int readLength) throws IOException{
-        
+        JobConf conf = new JobConf(GenomixDriver.class);
+        conf.setInt("sizeKmer", sizeKmer);
+        conf.setInt("readLength", readLength);
+
+        conf.setJobName("Genomix Graph Building");
+        conf.setMapperClass(GenomixMapper.class);
+        conf.setReducerClass(GenomixReducer.class);
+        conf.setCombinerClass(GenomixCombiner.class);
+
+        conf.setMapOutputKeyClass(KmerBytesWritable.class);
+        conf.setMapOutputValueClass(KmerCountValue.class);
+
+        conf.setInputFormat(TextInputFormat.class);
+        conf.setOutputFormat(SequenceFileOutputFormat.class);
+        conf.setOutputKeyClass(KmerBytesWritable.class);
+        conf.setOutputValueClass(KmerCountValue.class);
+        FileInputFormat.setInputPaths(conf, new Path(inputPath));
+        FileOutputFormat.setOutputPath(conf, new Path(outputPath));
+        conf.setNumReduceTasks(numReducers);
+
+        FileSystem dfs = FileSystem.get(conf);
+        dfs.delete(new Path(outputPath), true);
+        JobClient.runJob(conf);
     }
     
     public static void main(String[] args) throws Exception {
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
new file mode 100644
index 0000000..b0f0488
--- /dev/null
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
@@ -0,0 +1,101 @@
+package edu.uci.ics.genomix.hadoop.contrailgraphbuilding;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+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.Reporter;
+
+import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.KmerBytesWritableFactory;
+import edu.uci.ics.genomix.type.KmerListWritable;
+import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.PositionWritable;
+
+@SuppressWarnings("deprecation")
+public class GenomixMapper extends MapReduceBase implements
+    Mapper<LongWritable, Text, KmerBytesWritable, NodeWritable>{
+    
+    public static enum KmerDir{
+        FORWARD,
+        REVERSE,
+    }
+    
+    public static int KMER_SIZE;
+    private KmerBytesWritable preForwardKmer;
+    private KmerBytesWritable preReverseKmer;
+    private KmerBytesWritable curForwardKmer;
+    private KmerBytesWritable curReverseKmer;
+    private KmerBytesWritable nextForwardKmer;
+    private KmerBytesWritable nextReverseKmer;
+    private NodeWritable outputNode;
+    private PositionWritable nodeId;
+    private KmerListWritable kmerList;
+    
+    private KmerBytesWritableFactory kmerFactory;
+    private KmerDir preKmerDir;
+    private KmerDir curKmerDir;
+    private KmerDir nextKmerDir;
+    
+    byte mateId = (byte)0;
+    
+    @Override
+    public void configure(JobConf job) {
+        KMER_SIZE = Integer.parseInt(job.get("sizeKmer"));
+        preForwardKmer = new KmerBytesWritable(KMER_SIZE);
+        preReverseKmer = new KmerBytesWritable(KMER_SIZE);
+        curForwardKmer = new KmerBytesWritable(KMER_SIZE);
+        curReverseKmer = new KmerBytesWritable(KMER_SIZE);
+        nextForwardKmer = new KmerBytesWritable(KMER_SIZE);
+        nextReverseKmer = new KmerBytesWritable(KMER_SIZE);
+        outputNode = new NodeWritable();
+        nodeId = new PositionWritable();
+        kmerList = new KmerListWritable();
+        kmerFactory = new KmerBytesWritableFactory(KMER_SIZE);
+        preKmerDir = KmerDir.FORWARD;
+        curKmerDir = KmerDir.FORWARD;
+        nextKmerDir = KmerDir.FORWARD;
+    }
+    
+    @Override
+    public void map(LongWritable key, Text value, OutputCollector<KmerBytesWritable, NodeWritable> output,
+            Reporter reporter) throws IOException {
+        /** 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];
+        Pattern genePattern = Pattern.compile("[AGCT]+");
+        Matcher geneMatcher = genePattern.matcher(geneLine);
+        boolean isValid = geneMatcher.matches();
+        if (isValid == true) {
+            byte[] array = geneLine.getBytes();
+            if (KMER_SIZE >= array.length) {
+                throw new IOException("short read");
+            }
+            curForwardKmer.setByRead(array, 0);
+            curReverseKmer.set(kmerFactory.reverse(curForwardKmer));
+            if(curForwardKmer.compareTo(curReverseKmer) >= 0)
+                curKmerDir = KmerDir.FORWARD;
+            else
+                curKmerDir = KmerDir.REVERSE;
+            nodeId.set(mateId, readID, 0);
+            setNextKmer(array[KMER_SIZE]);
+        }
+    }
+    
+    public void setNextKmer(byte nextChar){
+        nextForwardKmer.set(curForwardKmer);
+        nextForwardKmer.shiftKmerWithNextChar(nextChar);
+        nextForwardKmer.set(kmerFactory.reverse(nextForwardKmer));
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
index dd37a6a..1a793cd 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java
@@ -39,13 +39,6 @@
      * initiate kmerSize, maxIteration
      */
     public void initVertex() {
-//        if (kmerSize == -1)
-//            kmerSize = getContext().getConfiguration().getInt(KMER_SIZE, 5);
-//        if (maxIteration < 0)
-//            maxIteration = getContext().getConfiguration().getInt(ITERATIONS, 1000000);
-//        outFlag = (byte)0;
-//        outgoingMsg.reset();
-//        headFlag = (byte)(getVertexValue().getState() & State.IS_HEAD);
     }
     
     /**
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
index 59104f7..05a4700 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
@@ -102,8 +102,6 @@
     /**
      * set nextID to the element that's next (in the node's FF or FR list), returning true when there is a next neighbor
      */
-
-
     protected boolean setNextInfo(VertexValueWritable value) {
         if (value.getFFList().getCountOfPosition() > 0) {
             nextID.set(value.getFFList().getPosition(0));
@@ -121,7 +119,6 @@
     /**
      * set prevID to the element that's previous (in the node's RR or RF list), returning true when there is a previous neighbor
      */
-     
     protected boolean setPrevInfo(VertexValueWritable value) {
         if (value.getRRList().getCountOfPosition() > 0) {
             prevID.set(value.getRRList().getPosition(0));
@@ -169,8 +166,7 @@
                     } else if (hasPrev && !prevHead) {
                         // compress this head to the reverse tail
                         sendUpdateMsgToSuccessor();
-                    } //else
-                        //voteToHalt();
+                    } 
                 }
             }else {
                     // I'm a tail
@@ -179,24 +175,20 @@
                             // tails on both sides, and I'm the "local minimum"
                             // compress me towards the tail in forward dir
                             sendUpdateMsgToPredecessor();
-                        } //else
-                            //voteToHalt();
+                        }
                     } else if (!hasPrev) {
                         // no previous node
                         if (!nextHead && curID.compareTo(nextID) < 0) {
                             // merge towards tail in forward dir
                             sendUpdateMsgToPredecessor();
-                        } //else
-                            //voteToHalt();
+                        }
                     } else if (!hasNext) {
                         // no next node
                         if (!prevHead && curID.compareTo(prevID) < 0) {
                             // merge towards tail in reverse dir
                             sendUpdateMsgToSuccessor();
-                        } //else
-                            //voteToHalt();
-                    } //else
-                        //voteToHalt();
+                        }
+                    }
                 }
         }
         else if (getSuperstep() % 4 == 0){
