diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
index 68d70ad..110247e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeOutputFormat.java
@@ -37,8 +37,8 @@
         @Override
         public void writeVertex(Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, ?> vertex)
                 throws IOException, InterruptedException {
-            if (vertex.getVertexValue().getState() != State.END_VERTEX
-                    && vertex.getVertexValue().getState() != State.MID_VERTEX) {
+            //&& vertex.getVertexValue().getState() != State.MID_VERTEX
+            if (vertex.getVertexValue().getState() != State.END_VERTEX) {
                 getRecordWriter().write(vertex.getVertexId(), vertex.getVertexValue());
             }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/NaiveAlgorithmMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/NaiveAlgorithmMessageWritable.java
index f9574a4..c5378a2 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/NaiveAlgorithmMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/NaiveAlgorithmMessageWritable.java
@@ -21,19 +21,21 @@
     private KmerBytesWritable sourceVertexId;
     private byte adjMap;
     private byte lastGeneCode;
+    private VKmerBytesWritable chainVertexId;
     private byte message;
 
     private byte checkMessage;
 
     public NaiveAlgorithmMessageWritable() {
         sourceVertexId = new VKmerBytesWritable(NaiveAlgorithmForPathMergeVertex.kmerSize);
+        chainVertexId = new VKmerBytesWritable(1);
         adjMap = (byte) 0;
-        lastGeneCode = (byte) 0;
+        lastGeneCode = (byte) -1;
         message = Message.NON;
         checkMessage = (byte) 0;
     }
 
-    public void set(KmerBytesWritable sourceVertex, byte adjMap, byte lastGeneCode, byte message) {
+    public void set(KmerBytesWritable sourceVertex, byte adjMap, byte lastGeneCode, VKmerBytesWritable chainVertexId, byte message) {
         checkMessage = 0;
         if (sourceVertexId != null) {
             checkMessage |= CheckMessage.SOURCE;
@@ -47,13 +49,18 @@
             checkMessage |= CheckMessage.LASTGENECODE;
             this.lastGeneCode = lastGeneCode;
         }
+        if (chainVertexId != null) {
+            checkMessage |= CheckMessage.CHAIN;
+            this.chainVertexId.set(chainVertexId);
+        }
         this.message = message;
     }
 
     public void reset() {
         checkMessage = 0;
         adjMap = (byte) 0;
-        lastGeneCode = (byte) 0;
+        lastGeneCode = (byte) -1;
+        chainVertexId.reset(1);
         message = Message.NON;
     }
 
@@ -84,12 +91,27 @@
     }
 
     public void setLastGeneCode(byte lastGeneCode) {
-        if (lastGeneCode != 0) {
+        if (lastGeneCode != -1) {
             checkMessage |= CheckMessage.LASTGENECODE;
             this.lastGeneCode = lastGeneCode;
         }
     }
 
+    public VKmerBytesWritable getChainVertexId() {
+        return chainVertexId;
+    }
+
+    public void setChainVertexId(VKmerBytesWritable chainVertexId) {
+        if (chainVertexId != null) {
+            checkMessage |= CheckMessage.CHAIN;
+            this.chainVertexId.set(chainVertexId);
+        }
+    }
+    
+    public int getLengthOfChain() {
+        return chainVertexId.getKmerLength();
+    }
+
     public byte getMessage() {
         return message;
     }
@@ -98,6 +120,10 @@
         this.message = message;
     }
 
+    public boolean isGeneCode(){
+        return ((checkMessage & CheckMessage.LASTGENECODE) != 0); 
+    }
+    
     @Override
     public void write(DataOutput out) throws IOException {
         out.writeByte(checkMessage);
@@ -107,6 +133,8 @@
             out.write(adjMap);
         if ((checkMessage & CheckMessage.LASTGENECODE) != 0)
             out.write(lastGeneCode);
+        if ((checkMessage & CheckMessage.CHAIN) != 0)
+            chainVertexId.write(out);
         out.write(message);
     }
 
@@ -120,6 +148,8 @@
             adjMap = in.readByte();
         if ((checkMessage & CheckMessage.LASTGENECODE) != 0)
             lastGeneCode = in.readByte();
+        if ((checkMessage & CheckMessage.CHAIN) != 0)
+            chainVertexId.readFields(in);
         message = in.readByte();
     }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java
new file mode 100644
index 0000000..96886de
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/P3ForPathMergeVertex.java
@@ -0,0 +1,419 @@
+package edu.uci.ics.genomix.pregelix.operator;
+
+import java.util.Iterator;
+import org.apache.hadoop.io.NullWritable;
+
+import edu.uci.ics.genomix.type.GeneCode;
+import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.VKmerBytesWritableFactory;
+
+import edu.uci.ics.pregelix.api.graph.Vertex;
+import edu.uci.ics.pregelix.api.job.PregelixJob;
+import edu.uci.ics.genomix.pregelix.client.Client;
+import edu.uci.ics.genomix.pregelix.format.NaiveAlgorithmForPathMergeInputFormat;
+import edu.uci.ics.genomix.pregelix.format.NaiveAlgorithmForPathMergeOutputFormat;
+import edu.uci.ics.genomix.pregelix.io.NaiveAlgorithmMessageWritable;
+import edu.uci.ics.genomix.pregelix.io.ValueStateWritable;
+import edu.uci.ics.genomix.pregelix.type.Message;
+import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.util.VertexUtil;
+
+/*
+ * vertexId: BytesWritable
+ * vertexValue: ByteWritable
+ * edgeValue: NullWritable
+ * message: NaiveAlgorithmMessageWritable
+ * 
+ * DNA:
+ * A: 00
+ * C: 01
+ * G: 10
+ * T: 11
+ * 
+ * succeed node
+ *  A 00000001 1
+ *  G 00000010 2
+ *  C 00000100 4
+ *  T 00001000 8
+ * precursor node
+ *  A 00010000 16
+ *  G 00100000 32
+ *  C 01000000 64
+ *  T 10000000 128
+ *  
+ * For example, ONE LINE in input file: 00,01,10	0001,0010,
+ * That means that vertexId is ACG, its succeed node is A and its precursor node is C.
+ * The succeed node and precursor node will be stored in vertexValue and we don't use edgeValue.
+ * The details about message are in edu.uci.ics.pregelix.example.io.MessageWritable. 
+ */
+/**
+ * Naive Algorithm for path merge graph
+ */
+public class P3ForPathMergeVertex extends
+        Vertex<KmerBytesWritable, ValueStateWritable, NullWritable, NaiveAlgorithmMessageWritable> {
+    public static final String KMER_SIZE = "P3ForPathMergeVertex.kmerSize";
+    public static final String ITERATIONS = "P3ForPathMergeVertex.iteration";
+    public static int kmerSize = -1;
+    private int maxIteration = -1;
+    public static final double pseudoRatio = 0.2;
+    public static int maxPseudoHeads = 1;
+    public static int maxRound = 2;
+
+    private NaiveAlgorithmMessageWritable incomingMsg = new NaiveAlgorithmMessageWritable();
+    private NaiveAlgorithmMessageWritable outgoingMsg = new NaiveAlgorithmMessageWritable();
+
+    private VKmerBytesWritableFactory kmerFactory = new VKmerBytesWritableFactory(1);
+    private VKmerBytesWritable lastKmer = new VKmerBytesWritable(1);
+    private VKmerBytesWritable destVertexId = new VKmerBytesWritable(1);
+
+    /**
+     * 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);
+        outgoingMsg.reset();
+    }
+
+    /**
+     * get destination vertex
+     */
+    public VKmerBytesWritable getDestVertexId(KmerBytesWritable vertexId, byte geneCode) {
+        return kmerFactory.shiftKmerWithNextCode(vertexId, geneCode);
+    }
+
+    public VKmerBytesWritable getPreDestVertexId(KmerBytesWritable vertexId, byte geneCode) {
+        return kmerFactory.shiftKmerWithPreCode(vertexId, geneCode);
+    }
+
+    public VKmerBytesWritable getDestVertexIdFromChain(VKmerBytesWritable chainVertexId, byte adjMap) {
+        VKmerBytesWritable lastKmer = kmerFactory.getLastKmerFromChain(kmerSize, chainVertexId);
+        return getDestVertexId(lastKmer, GeneCode.getGeneCodeFromBitMap((byte) (adjMap & 0x0F)));
+    }
+
+    /**
+     * head send message to all next nodes
+     */
+    public void sendMsgToAllNextNodes(KmerBytesWritable vertexId, byte adjMap) {
+        for (byte x = GeneCode.A; x <= GeneCode.T; x++) {
+            if ((adjMap & (1 << x)) != 0) {
+                destVertexId.set(getDestVertexId(vertexId, x));
+                sendMsg(destVertexId, outgoingMsg);
+            }
+        }
+    }
+
+    /**
+     * head send message to all previous nodes
+     */
+    public void sendMsgToAllPreviousNodes(KmerBytesWritable vertexId, byte adjMap) {
+        for (byte x = GeneCode.A; x <= GeneCode.T; x++) {
+            if (((adjMap >> 4) & (1 << x)) != 0) {
+                destVertexId.set(getPreDestVertexId(vertexId, x));
+                sendMsg(destVertexId, outgoingMsg);
+            }
+        }
+    }
+
+    /**
+     * start sending message
+     */
+    public void startSendMsg() {
+        if (VertexUtil.isHeadVertex(getVertexValue().getAdjMap())) {
+            outgoingMsg.setMessage(Message.START);
+            sendMsgToAllNextNodes(getVertexId(), getVertexValue().getAdjMap());
+            voteToHalt();
+        }
+        if (VertexUtil.isRearVertex(getVertexValue().getAdjMap())) {
+            outgoingMsg.setMessage(Message.END);
+            sendMsgToAllPreviousNodes(getVertexId(), getVertexValue().getAdjMap());
+            voteToHalt();
+        }
+    }
+
+    /**
+     * initiate head, rear and path node
+     */
+    public void initState(Iterator<NaiveAlgorithmMessageWritable> msgIterator) {
+        if (msgIterator.hasNext()) {
+            do {
+                if (!VertexUtil.isPathVertex(getVertexValue().getAdjMap())) {
+                    msgIterator.next();
+                    voteToHalt();
+                } else {
+                    incomingMsg = msgIterator.next();
+                    setState();
+                }
+            } while (msgIterator.hasNext());
+        } else {
+            /*double random = Math.random();
+            if (random < pseudoRatio)
+                markPseudoHead();
+            else{
+                getVertexValue().setState(State.NON);
+                voteToHalt();
+            }*/
+            if (getVertexId().toString().equals("CCTCA")) //AGTAC
+                markPseudoHead();
+            else
+                voteToHalt();
+        }
+    }
+
+    /**
+     * mark the pseudoHead
+     */
+    public void markPseudoHead() {
+        getVertexValue().setState(State.PSEUDOHEAD);
+        outgoingMsg.setMessage(Message.FROMPSEUDOHEAD);
+        destVertexId
+                .set(getPreDestVertexId(getVertexId(), GeneCode.getGeneCodeFromBitMap(getVertexValue().getAdjMap())));
+        sendMsg(destVertexId, outgoingMsg);
+    }
+
+    /**
+     * mark the pseudoRear
+     */
+    public void markPseudoRear() {
+        if (incomingMsg.getMessage() == Message.FROMPSEUDOHEAD 
+                && getVertexValue().getState() != State.START_VERTEX) {
+            getVertexValue().setState(State.PSEUDOREAR);
+            voteToHalt();
+        }
+        else if(incomingMsg.getMessage() == Message.FROMPSEUDOHEAD 
+                && getVertexValue().getState() == State.START_VERTEX){
+            getVertexValue().setState(State.START_HALT);
+        }
+    }
+
+    /**
+     * set vertex state
+     */
+    public void setState() {
+        if (incomingMsg.getMessage() == Message.START) {
+            getVertexValue().setState(State.START_VERTEX);
+        } else if (incomingMsg.getMessage() == Message.END && getVertexValue().getState() != State.START_VERTEX) {
+            getVertexValue().setState(State.END_VERTEX);
+            voteToHalt();
+        } else
+            voteToHalt();
+    }
+    
+    /**
+     * merge chain vertex
+     */
+    public void mergeChainVertex(){
+        if(incomingMsg.isGeneCode() == true){
+            getVertexValue().setMergeChain(
+                    kmerFactory.mergeKmerWithNextCode(getVertexValue().getMergeChain(),
+                            incomingMsg.getLastGeneCode()));
+        }
+        else{
+            lastKmer.set(kmerFactory.getLastKmerFromChain(incomingMsg.getLengthOfChain() - kmerSize + 1,
+                    incomingMsg.getChainVertexId()));
+            getVertexValue().setMergeChain(
+                    kmerFactory.mergeTwoKmer(getVertexValue().getMergeChain(), 
+                            lastKmer));
+        }
+    }
+    
+    /**
+     * head node sends message to path node
+     */
+    public void sendMsgToPathVertexMergePhase(Iterator<NaiveAlgorithmMessageWritable> msgIterator) {
+        if (getSuperstep() == 3 + 2 * maxRound + 2) {
+            outgoingMsg.setSourceVertexId(getVertexId());
+            destVertexId.set(getDestVertexIdFromChain(getVertexValue().getMergeChain(), getVertexValue().getAdjMap()));
+            sendMsg(destVertexId, outgoingMsg);
+        } else {
+            while (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                if (incomingMsg.getMessage() != Message.STOP) {
+                    mergeChainVertex();
+                    outgoingMsg.setSourceVertexId(getVertexId());
+                    destVertexId
+                            .set(getDestVertexIdFromChain(getVertexValue().getMergeChain(), incomingMsg.getAdjMap()));
+                    sendMsg(destVertexId, outgoingMsg);
+                } else {
+                    getVertexValue().setMergeChain(
+                            kmerFactory.mergeKmerWithNextCode(getVertexValue().getMergeChain(),
+                                    incomingMsg.getLastGeneCode()));
+                    byte adjMap = VertexUtil.updateRightNeighber(getVertexValue().getAdjMap(), incomingMsg.getAdjMap());
+                    getVertexValue().setAdjMap(adjMap);
+                    getVertexValue().setState(State.FINAL_VERTEX);
+                    //String source = getVertexValue().getMergeChain().toString();
+                    //System.out.println();
+                }
+            }
+        }
+    }
+
+    /**
+     * path node sends message back to head node
+     */
+    public void responseMsgToHeadVertexMergePhase() {
+        deleteVertex(getVertexId());
+        outgoingMsg.setAdjMap(getVertexValue().getAdjMap());
+        if(getVertexValue().getLengthOfMergeChain() == 0)
+            outgoingMsg.setLastGeneCode(getVertexId().getGeneCodeAtPosition(kmerSize - 1));
+        else
+            outgoingMsg.setChainVertexId(getVertexValue().getMergeChain());
+        if (getVertexValue().getState() == State.END_VERTEX)
+            outgoingMsg.setMessage(Message.STOP);
+        sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
+    }
+    
+    /**
+     * head node sends message to path node in partition phase
+     */
+    public void sendMsgToPathVertexPartitionPhase(Iterator<NaiveAlgorithmMessageWritable> msgIterator) {
+        if (getSuperstep() == 4) {
+            getVertexValue().setMergeChain(getVertexId());
+            if(getVertexValue().getState() != State.START_HALT){
+                outgoingMsg.setSourceVertexId(getVertexId());
+                destVertexId.set(getDestVertexIdFromChain(getVertexValue().getMergeChain(), getVertexValue().getAdjMap()));
+                sendMsg(destVertexId, outgoingMsg);
+            }
+            else{
+                outgoingMsg.setMessage(Message.FROMSELF);
+                sendMsg(getVertexId(), outgoingMsg);
+            }
+        } else {
+            while (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                //if from pseudoHead, voteToHalt(), otherwise ...
+                if (incomingMsg.getMessage() != Message.FROMPSEUDOHEAD){
+                    mergeChainVertex();
+                    byte adjMap = VertexUtil.updateRightNeighber(getVertexValue().getAdjMap(), incomingMsg.getAdjMap());
+                    getVertexValue().setAdjMap(adjMap);
+                    if (incomingMsg.getMessage() != Message.STOP && incomingMsg.getMessage() != Message.FROMREAR) {
+                        outgoingMsg.setSourceVertexId(getVertexId());
+                        destVertexId.set(getDestVertexIdFromChain(getVertexValue().getMergeChain(),
+                                incomingMsg.getAdjMap()));
+                        sendMsg(destVertexId, outgoingMsg);
+                    } else {
+                        //check head or pseudoHead
+                        if (getVertexValue().getState() == State.START_VERTEX
+                                && incomingMsg.getMessage() == Message.FROMREAR) {
+                            getVertexValue().setState(State.FINAL_VERTEX);
+                            //String source = getVertexValue().getMergeChain().toString();
+                            //System.out.println();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * path node sends message back to head node in partition phase
+     */
+    public void responseMsgToHeadVertexPartitionPhase() {
+        if(incomingMsg.getMessage() == Message.FROMSELF){
+            outgoingMsg.setMessage(Message.FROMSELF);
+            sendMsg(getVertexId(), outgoingMsg);
+        } else{
+            if (getVertexValue().getState() == State.PSEUDOHEAD)
+                outgoingMsg.setMessage(Message.FROMPSEUDOHEAD);
+            else {
+                deleteVertex(getVertexId());
+                outgoingMsg.setAdjMap(getVertexValue().getAdjMap());
+                if(getVertexValue().getLengthOfMergeChain() == 0)
+                    outgoingMsg.setLastGeneCode(getVertexId().getGeneCodeAtPosition(kmerSize - 1));
+                else
+                    outgoingMsg.setChainVertexId(getVertexValue().getMergeChain());
+                if (getVertexValue().getState() == State.PSEUDOREAR)
+                    outgoingMsg.setMessage(Message.FROMPSEUDOREAR);
+                else if (getVertexValue().getState() == State.END_VERTEX)
+                    outgoingMsg.setMessage(Message.STOP);
+            }
+            sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
+        }   
+    }
+    
+    /**
+     * final process the result of partition phase
+     */
+    public void finalProcessPartitionPhase(Iterator<NaiveAlgorithmMessageWritable> msgIterator){
+        if(incomingMsg.getMessage() != Message.FROMSELF){
+            while (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                mergeChainVertex();
+                byte adjMap = VertexUtil.updateRightNeighber(getVertexValue().getAdjMap(), incomingMsg.getAdjMap());
+                getVertexValue().setAdjMap(adjMap);
+                //check head or pseudoHead
+                if (getVertexValue().getState() == State.START_VERTEX
+                        && incomingMsg.getMessage() == Message.FROMREAR) {
+                    getVertexValue().setState(State.FINAL_VERTEX);
+                    //String source = getVertexValue().getMergeChain().toString();
+                    //System.out.println();
+                }
+            }
+        }
+    }
+    /**
+     * After partition phase, reset state: ex. psudoHead and psudoRear -> null
+     */
+    public void resetState() {
+        if (getVertexValue().getState() == State.PSEUDOHEAD || getVertexValue().getState() == State.PSEUDOREAR) {
+            getVertexValue().setState(State.NON_VERTEX);
+        }
+        if(getVertexValue().getState() == State.START_HALT)
+            getVertexValue().setState(State.START_VERTEX);
+    }
+
+    @Override
+    public void compute(Iterator<NaiveAlgorithmMessageWritable> msgIterator) {
+        initVertex();
+        if (getSuperstep() == 1)
+            startSendMsg();
+        else if (getSuperstep() == 2)
+            initState(msgIterator);
+        else if (getSuperstep() == 3) {
+            if (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                markPseudoRear();
+            }
+        } else if (getSuperstep() % 2 == 0 && getSuperstep() <= 3 + 2 * maxRound && getSuperstep() <= maxIteration) {
+            sendMsgToPathVertexPartitionPhase(msgIterator);
+            voteToHalt();
+        } else if (getSuperstep() % 2 == 1 && getSuperstep() <= 3 + 2 * maxRound && getSuperstep() <= maxIteration) {
+            while (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                responseMsgToHeadVertexPartitionPhase();
+            }
+            voteToHalt();
+        } else if(getSuperstep() == 3 + 2 * maxRound + 1 && getSuperstep() <= maxIteration){
+            finalProcessPartitionPhase(msgIterator);
+        } else if (getSuperstep() % 2 == 1 && getSuperstep() <= maxIteration) {
+            resetState();
+            if(getVertexValue().getState() == State.START_VERTEX)
+                sendMsgToPathVertexMergePhase(msgIterator);
+            voteToHalt();
+        } else if (getSuperstep() % 2 == 0 && getSuperstep() <= maxIteration) {
+            while (msgIterator.hasNext()) {
+                incomingMsg = msgIterator.next();
+                responseMsgToHeadVertexMergePhase();
+            }
+            voteToHalt();
+        } else
+            voteToHalt();
+    }
+
+    public static void main(String[] args) throws Exception {
+        PregelixJob job = new PregelixJob(P3ForPathMergeVertex.class.getSimpleName());
+        job.setVertexClass(P3ForPathMergeVertex.class);
+        /**
+         * BinaryInput and BinaryOutput
+         */
+        job.setVertexInputFormatClass(NaiveAlgorithmForPathMergeInputFormat.class);
+        job.setVertexOutputFormatClass(NaiveAlgorithmForPathMergeOutputFormat.class);
+        job.setDynamicVertexValueSize(true);
+        job.setOutputKeyClass(KmerBytesWritable.class);
+        job.setOutputValueClass(ValueStateWritable.class);
+        Client.run(args, job);
+    }
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/Message.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/Message.java
index 4332471..21d732e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/Message.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/Message.java
@@ -6,7 +6,10 @@
     public static final byte START = 1;
     public static final byte END = 2;
     public static final byte STOP = 3;
-    public static final byte PSEUDOREAR = 4;
+    public static final byte FROMPSEUDOHEAD = 4;
+    public static final byte FROMPSEUDOREAR = 5;
+    public static final byte FROMREAR = 6;
+    public static final byte FROMSELF = 7;
 
     public final static class MESSAGE_CONTENT {
 
@@ -25,8 +28,17 @@
                 case STOP:
                     r = "STOP";
                     break;
-                case PSEUDOREAR:
-                    r = "PSEUDOREAR";
+                case FROMPSEUDOHEAD:
+                    r = "FROMPSEUDOHEAD";
+                    break;
+                case FROMPSEUDOREAR:
+                    r = "FROMPSEUDOREAR";
+                    break;
+                case FROMREAR:
+                    r = "FROMREAR";
+                    break;
+                case FROMSELF:
+                    r = "FROMSELF";
                     break;
             }
             return r;
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
index c1f4696..6730299 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
@@ -5,7 +5,7 @@
     public static final byte NON_VERTEX = 0;
     public static final byte START_VERTEX = 1;
     public static final byte END_VERTEX = 2;
-    public static final byte MID_VERTEX = 3;
+    public static final byte START_HALT = 3;
     public static final byte PSEUDOHEAD = 4;
     public static final byte PSEUDOREAR = 5;
     public static final byte FINAL_VERTEX = 6;
@@ -25,8 +25,8 @@
                 case END_VERTEX:
                     r = "END_VERTEX";
                     break;
-                case MID_VERTEX:
-                    r = "MID_VERTEX";
+                case START_HALT:
+                    r = "START_HALT";
                     break;
                 case PSEUDOHEAD:
                     r = "PSEUDOHEAD";
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 8b138f2..85ab456 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
@@ -11,6 +11,7 @@
 import edu.uci.ics.genomix.pregelix.io.ValueStateWritable;
 import edu.uci.ics.genomix.pregelix.operator.NaiveAlgorithmForPathMergeVertex;
 import edu.uci.ics.genomix.pregelix.operator.LogAlgorithmForPathMergeVertex;
+import edu.uci.ics.genomix.pregelix.operator.P3ForPathMergeVertex;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.pregelix.api.job.PregelixJob;
 
@@ -50,10 +51,28 @@
     private static void genLogAlgorithmForMergeGraph() throws IOException {
         generateLogAlgorithmForMergeGraphJob("LogAlgorithmForMergeGraph", outputBase + "LogAlgorithmForMergeGraph.xml");
     }
+    
+    private static void generateP3ForMergeGraphJob(String jobName, String outputPath) throws IOException {
+        PregelixJob job = new PregelixJob(jobName);
+        job.setVertexClass(P3ForPathMergeVertex.class);
+        job.setVertexInputFormatClass(NaiveAlgorithmForPathMergeInputFormat.class);
+        job.setVertexOutputFormatClass(NaiveAlgorithmForPathMergeOutputFormat.class);
+        job.setDynamicVertexValueSize(true);
+        job.setOutputKeyClass(KmerBytesWritable.class);
+        job.setOutputValueClass(ValueStateWritable.class);
+        job.getConfiguration().setInt(P3ForPathMergeVertex.KMER_SIZE, 5);
+        job.getConfiguration().writeXml(new FileOutputStream(new File(outputPath)));
+    }
+
+    private static void genP3ForMergeGraph() throws IOException {
+        generateP3ForMergeGraphJob("P3ForMergeGraph", outputBase
+                + "P3ForMergeGraph.xml");
+    }
 
     public static void main(String[] args) throws IOException {
-        genNaiveAlgorithmForMergeGraph();
-        genLogAlgorithmForMergeGraph();
+        //genNaiveAlgorithmForMergeGraph();
+        //genLogAlgorithmForMergeGraph();
+        genP3ForMergeGraph();
     }
 
 }
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
index dcbbb79..306e083 100644
--- 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
@@ -45,19 +45,18 @@
 
     public static final String PreFix = "data/PathTestSet"; //"graphbuildresult";
     public static final String[] TestDir = { PreFix + File.separator
-    //+  "split.aa"};
-    //+ "split.aa"};/*, PreFix + File.separator
+    + "LongPath"};/*, 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",
+            /*+ "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" };
+            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";
