change directionFlag back
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
index d1fcd6b..3fd9ef1 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
@@ -31,32 +31,11 @@
 
     // merge/update directions
     public static class DirectionFlag {
-        public static final byte DIR_NO = 0b000 << 0;
-        public static final byte DIR_FF = 0b001 << 0;
-        public static final byte DIR_FR = 0b010 << 0;
-        public static final byte DIR_RF = 0b011 << 0;
-        public static final byte DIR_RR = 0b100 << 0;
-        public static final byte DIR_MASK = 0b111 << 0;
-    }
-    
-    public static class SpecialVertexFlag extends DirectionFlag {
-        public static final byte IS_NON = 0b00 << 5;
-        public static final byte IS_RANDOMTAIL = 0b00 << 5;
-        public static final byte IS_STOP = 0b00 << 5;
-        public static final byte IS_HEAD = 0b01 << 5;
-        public static final byte IS_FINAL = 0b10 << 5;
-        public static final byte IS_RANDOMHEAD = 0b11 << 5;
-        public static final byte IS_OLDHEAD = 0b11 << 5;
-
-        public static final byte VERTEX_MASK = 0b11 << 5;
-        public static final byte VERTEX_CLEAR = (byte) 11001111;
-    }
-    
-    public static class MergeDirFlag extends SpecialVertexFlag{
-        public static final byte NO_MERGE = 0b00 << 3;
-        public static final byte SHOULD_MERGEWITHNEXT = 0b01 << 3;
-        public static final byte SHOULD_MERGEWITHPREV = 0b10 << 3;
-        public static final byte SHOULD_MERGE_MASK = 0b11 << 3;
+        public static final byte DIR_FF = 0b00 << 0;
+        public static final byte DIR_FR = 0b01 << 0;
+        public static final byte DIR_RF = 0b10 << 0;
+        public static final byte DIR_RR = 0b11 << 0;
+        public static final byte DIR_MASK = 0b11 << 0;
     }
 
     private PositionWritable nodeID;
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
index f9a3444..ba5b601 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/LogAlgorithmForPathMergeInputFormat.java
@@ -10,7 +10,7 @@
 import edu.uci.ics.genomix.pregelix.api.io.binary.BinaryVertexInputFormat;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 import edu.uci.ics.pregelix.api.graph.Vertex;
@@ -71,7 +71,7 @@
                 vertexValue.setRFList(node.getRFList());
                 vertexValue.setRRList(node.getRRList());
                 vertexValue.setKmer(node.getKmer());
-                vertexValue.setState(State.NON_VERTEX);
+                vertexValue.setState(State.IS_NON);
                 vertex.setVertexValue(vertexValue);
             }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
index b9af850..13ca02c 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/NaiveAlgorithmForPathMergeInputFormat.java
@@ -14,7 +14,7 @@
 import edu.uci.ics.pregelix.api.util.BspUtils;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.api.io.binary.BinaryVertexInputFormat;
 import edu.uci.ics.genomix.pregelix.api.io.binary.BinaryVertexInputFormat.BinaryVertexReader;
 
@@ -74,7 +74,7 @@
             vertexValue.setRFList(node.getRFList());
             vertexValue.setRRList(node.getRRList());
             vertexValue.setKmer(node.getKmer());
-            vertexValue.setState(State.NON_VERTEX);
+            vertexValue.setState(State.IS_NON);
             vertex.setVertexValue(vertexValue);
         }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
index 2defa0c..9274c80 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java
@@ -5,13 +5,32 @@
 import org.apache.hadoop.io.WritableComparable;
 
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.type.State;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 
 public class VertexValueWritable implements WritableComparable<VertexValueWritable> {
 
+    public static class VertexStateFlag {
+        public static final byte IS_NON = 0b00 << 5;
+        public static final byte IS_RANDOMTAIL = 0b00 << 5;
+        public static final byte IS_STOP = 0b00 << 5;
+        public static final byte IS_HEAD = 0b01 << 5;
+        public static final byte IS_FINAL = 0b10 << 5;
+        public static final byte IS_RANDOMHEAD = 0b11 << 5;
+        public static final byte IS_OLDHEAD = 0b11 << 5;
+
+        public static final byte VERTEX_MASK = 0b11 << 5;
+        public static final byte VERTEX_CLEAR = (byte) 11001111;
+    }
+    
+    public static class State extends VertexStateFlag{
+        public static final byte NO_MERGE = 0b00 << 3;
+        public static final byte SHOULD_MERGEWITHNEXT = 0b01 << 3;
+        public static final byte SHOULD_MERGEWITHPREV = 0b10 << 3;
+        public static final byte SHOULD_MERGE_MASK = 0b11 << 3;
+    }
+    
     private AdjacencyListWritable incomingList;
     private AdjacencyListWritable outgoingList;
     private byte state;
@@ -21,7 +40,7 @@
     public VertexValueWritable() {
         incomingList = new AdjacencyListWritable();
         outgoingList = new AdjacencyListWritable();
-        state = State.NON_VERTEX;
+        state = State.IS_NON;
         kmer = new KmerBytesWritable(0);
         mergeDest = new PositionWritable();
     }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/log/LogAlgorithmLogFormatter.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/log/LogAlgorithmLogFormatter.java
index c29e1b3..5f6440f 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/log/LogAlgorithmLogFormatter.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/log/LogAlgorithmLogFormatter.java
@@ -4,7 +4,7 @@
 
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.type.Message;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.type.State2;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 
 public class LogAlgorithmLogFormatter extends Formatter {
@@ -83,7 +83,7 @@
                 builder.append("Chain Length: " + msg.getLengthOfChain() + "\r\n");
             }
 
-            builder.append("State is: " + State.STATE_CONTENT.getContentFromCode(state) + "\r\n");
+            builder.append("State is: " + State2.STATE_CONTENT.getContentFromCode(state) + "\r\n");
         }
         if (operation == 2) {
             chain = mergeChain.toString();
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 cd84272..3eb1023 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
@@ -10,6 +10,7 @@
 import edu.uci.ics.pregelix.api.graph.Vertex;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.type.AdjMessage;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
@@ -44,18 +45,18 @@
             maxIteration = getContext().getConfiguration().getInt(ITERATIONS, 1000000);
         outFlag = (byte)0;
         outgoingMsg.reset();
-        headFlag = (byte)(getVertexValue().getState() & MessageFlag.IS_HEAD);
+        headFlag = (byte)(getVertexValue().getState() & State.IS_HEAD);
     }
     
     /**
      * reset headFlag
      */
     public void resetHeadFlag(){
-        headFlag = (byte)(getVertexValue().getState() & MessageFlag.IS_HEAD);
+        headFlag = (byte)(getVertexValue().getState() & State.IS_HEAD);
     }
     
     public byte getHeadFlag(){
-        return (byte)(getVertexValue().getState() & MessageFlag.IS_HEAD);
+        return (byte)(getVertexValue().getState() & State.IS_HEAD);
     }
     
     /**
@@ -316,8 +317,8 @@
     public void sendMergeMsg(){
         if(selfFlag == MessageFlag.IS_HEAD){
             byte newState = getVertexValue().getState(); 
-            newState &= ~MessageFlag.IS_HEAD;
-            newState |= MessageFlag.IS_OLDHEAD;
+            newState &= ~State.IS_HEAD;
+            newState |= State.IS_OLDHEAD;
             getVertexValue().setState(newState);
             resetSelfFlag();
             outFlag |= MessageFlag.IS_HEAD;
@@ -360,7 +361,7 @@
     public void broadcastMergeMsg(){
         if(headFlag > 0)
             outFlag |= MessageFlag.IS_HEAD;
-        switch(getVertexValue().getState() & MessageFlag.SHOULD_MERGE_MASK) {
+        switch(getVertexValue().getState() & State.SHOULD_MERGE_MASK) {
             case MessageFlag.SHOULD_MERGEWITHNEXT:
                 setSuccessorAdjMsg();
                 if(ifFlipWithPredecessor())
@@ -392,7 +393,7 @@
      */
     public void sendUpdateMsgToPredecessor(){
         byte state = getVertexValue().getState();
-        state |= MessageFlag.SHOULD_MERGEWITHNEXT;
+        state |= State.SHOULD_MERGEWITHNEXT;
         getVertexValue().setState(state);
         if(getVertexValue().getFFList().getLength() > 0)
             getVertexValue().setMergeDest(getVertexValue().getFFList().getPosition(0));
@@ -407,7 +408,7 @@
      */
     public void sendUpdateMsgToSuccessor(){
         byte state = getVertexValue().getState();
-        state |= MessageFlag.SHOULD_MERGEWITHPREV;
+        state |= State.SHOULD_MERGEWITHPREV;
         getVertexValue().setState(state);
         if(getVertexValue().getRFList().getLength() > 0)
             getVertexValue().setMergeDest(getVertexValue().getRFList().getPosition(0));
@@ -479,7 +480,7 @@
         
         if((inFlag & MessageFlag.IS_HEAD) > 0){
             byte state = getVertexValue().getState();
-            state |= MessageFlag.IS_HEAD;
+            state |= State.IS_HEAD;
             getVertexValue().setState(state);
         }
         
@@ -509,8 +510,8 @@
      */
     public void setHeadState(){
         byte state = getVertexValue().getState();
-        state &= MessageFlag.VERTEX_CLEAR;
-        state |= MessageFlag.IS_HEAD;
+        state &= State.VERTEX_CLEAR;
+        state |= State.IS_HEAD;
         getVertexValue().setState(state);
     }
     
@@ -519,8 +520,8 @@
      */
     public void setFinalState(){
         byte state = getVertexValue().getState();
-        state &= MessageFlag.VERTEX_CLEAR;
-        state |= MessageFlag.IS_FINAL;
+        state &= State.VERTEX_CLEAR;
+        state |= State.IS_FINAL;
         getVertexValue().setState(state);
     }
     
@@ -529,8 +530,8 @@
      */
     public void setStopFlag(){
         byte state = incomingMsg.getFlag();
-        state &= MessageFlag.VERTEX_CLEAR;
-        state |= MessageFlag.IS_STOP;
+        state &= State.VERTEX_CLEAR;
+        state |= State.IS_STOP;
         getVertexValue().setState(state);
     }
     
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/NaiveAlgorithmForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/NaiveAlgorithmForPathMergeVertex.java
index 0b636ee..ba0d304 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/NaiveAlgorithmForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/NaiveAlgorithmForPathMergeVertex.java
@@ -14,8 +14,8 @@
 import edu.uci.ics.genomix.pregelix.format.NaiveAlgorithmForPathMergeOutputFormat;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.type.Message;
-import edu.uci.ics.genomix.pregelix.type.State;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 
 /*
@@ -171,9 +171,9 @@
      */
     public void setState() {
         if (incomingMsg.getFlag() == Message.START) {
-            getVertexValue().setState(State.START_VERTEX);
-        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State.START_VERTEX) {
-            getVertexValue().setState(State.END_VERTEX);
+            getVertexValue().setState(State.IS_HEAD);
+        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State.IS_HEAD) {
+            getVertexValue().setState(State.IS_HEAD);//is tail
             voteToHalt();
         } else
             voteToHalt();
@@ -208,7 +208,7 @@
                     sendMsg(destVertexId, outgoingMsg);
                 } else {
                     mergeChainVertex();
-                    getVertexValue().setState(State.FINAL_VERTEX);
+                    getVertexValue().setState(State.IS_FINAL);
                     //String source = getVertexValue().getKmer().toString();
                     //System.out.println();
                 }
@@ -223,7 +223,7 @@
         deleteVertex(getVertexId());
         outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList());
         outgoingMsg.setChainVertexId(getVertexValue().getKmer());
-        if (getVertexValue().getState() == State.END_VERTEX)
+        if (getVertexValue().getState() == State.IS_HEAD)//is_tail
             outgoingMsg.setFlag(Message.STOP);
         destVertexId.set(incomingMsg.getSourceVertexId());
         sendMsg(destVertexId, outgoingMsg);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P3ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P3ForPathMergeVertex.java
index 69e1fb6..a22d393 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P3ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P3ForPathMergeVertex.java
@@ -15,7 +15,7 @@
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.pregelix.type.Message;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.type.State2;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 
 /*
@@ -177,7 +177,7 @@
             if (random < pseudoRate)
                 markPseudoHead();
             else{
-                getVertexValue().setState(State.NON_VERTEX);
+                getVertexValue().setState(State2.NON_VERTEX);
                 voteToHalt();
             }
             /*if (getVertexId().toString().equals("CCTCA") || getVertexId().toString().equals("CTCAG")) //AGTAC CCTCA CTCAG CGCCC ACGCC
@@ -192,9 +192,9 @@
      */
     public void setState() {
         if (incomingMsg.getFlag() == Message.START) {
-            getVertexValue().setState(State.START_VERTEX);
-        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State.START_VERTEX) {
-            getVertexValue().setState(State.END_VERTEX);
+            getVertexValue().setState(State2.START_VERTEX);
+        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State2.START_VERTEX) {
+            getVertexValue().setState(State2.END_VERTEX);
             voteToHalt();
         } else
             voteToHalt();
@@ -204,7 +204,7 @@
      * mark the pseudoHead
      */
     public void markPseudoHead() {
-        getVertexValue().setState(State.PSEUDOHEAD);
+        getVertexValue().setState(State2.PSEUDOHEAD);
         outgoingMsg.setFlag(Message.FROMPSEUDOHEAD);
         destVertexId
                 .set(getPreDestVertexId(getVertexValue()));
@@ -216,13 +216,13 @@
      */
     public void markPseudoRear() {
         if (incomingMsg.getFlag() == Message.FROMPSEUDOHEAD 
-                && getVertexValue().getState() != State.START_VERTEX) {
-            getVertexValue().setState(State.PSEUDOREAR);
+                && getVertexValue().getState() != State2.START_VERTEX) {
+            getVertexValue().setState(State2.PSEUDOREAR);
             voteToHalt();
         }
         else if(incomingMsg.getFlag() == Message.FROMPSEUDOHEAD 
-                && getVertexValue().getState() == State.START_VERTEX){
-            getVertexValue().setState(State.START_HALT);
+                && getVertexValue().getState() == State2.START_VERTEX){
+            getVertexValue().setState(State2.START_HALT);
         }
     }
  
@@ -257,7 +257,7 @@
                     sendMsg(destVertexId, outgoingMsg);
                 } else {
                     mergeChainVertex();
-                    getVertexValue().setState(State.FINAL_VERTEX);
+                    getVertexValue().setState(State2.FINAL_VERTEX);
                     //String source = getVertexValue().getKmer().toString();
                     //System.out.println();
                 }
@@ -272,7 +272,7 @@
         deleteVertex(getVertexId());
         outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList());
         outgoingMsg.setChainVertexId(getVertexValue().getKmer());
-        if (getVertexValue().getState() == State.END_VERTEX)
+        if (getVertexValue().getState() == State2.END_VERTEX)
             outgoingMsg.setFlag(Message.STOP);
         sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
     }
@@ -282,7 +282,7 @@
      */
     public void sendMsgToPathVertexPartitionPhase(Iterator<MessageWritable> msgIterator) {
         if (getSuperstep() == 4) {
-            if(getVertexValue().getState() != State.START_HALT){
+            if(getVertexValue().getState() != State2.START_HALT){
                 outgoingMsg.setSourceVertexId(getVertexId());
                 destVertexId.set(getNextDestVertexId(getVertexValue()));
                 sendMsg(destVertexId, outgoingMsg);
@@ -302,14 +302,14 @@
                         voteToHalt();
                     } else {
                         //check head or pseudoHead
-                        if (getVertexValue().getState() == State.START_VERTEX
+                        if (getVertexValue().getState() == State2.START_VERTEX
                                 && incomingMsg.getFlag() == Message.STOP) {
-                            getVertexValue().setState(State.FINAL_VERTEX);
+                            getVertexValue().setState(State2.FINAL_VERTEX);
                             //String source = getVertexValue().getKmer().toString();
                             //System.out.println();
-                        } else if(getVertexValue().getState() == State.PSEUDOHEAD
+                        } else if(getVertexValue().getState() == State2.PSEUDOHEAD
                                 && incomingMsg.getFlag() == Message.STOP)
-                            getVertexValue().setState(State.END_VERTEX);
+                            getVertexValue().setState(State2.END_VERTEX);
                     }
                 }
             }
@@ -320,15 +320,15 @@
      * path node sends message back to head node in partition phase
      */
     public void responseMsgToHeadVertexPartitionPhase() {
-        if (getVertexValue().getState() == State.PSEUDOHEAD)
+        if (getVertexValue().getState() == State2.PSEUDOHEAD)
             outgoingMsg.setFlag(Message.FROMPSEUDOHEAD);
         else {
             deleteVertex(getVertexId());
             outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList()); //incomingMsg.getNeighberNode()
             outgoingMsg.setChainVertexId(getVertexValue().getKmer());
-            if (getVertexValue().getState() == State.PSEUDOREAR)
+            if (getVertexValue().getState() == State2.PSEUDOREAR)
                 outgoingMsg.setFlag(Message.FROMPSEUDOREAR);
-            else if (getVertexValue().getState() == State.END_VERTEX)
+            else if (getVertexValue().getState() == State2.END_VERTEX)
                 outgoingMsg.setFlag(Message.STOP);
         }
         sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
@@ -344,25 +344,25 @@
             mergeChainVertex();
             getVertexValue().setOutgoingList(incomingMsg.getNeighberNode());
             //check head or pseudoHead
-            if (getVertexValue().getState() == State.START_VERTEX
+            if (getVertexValue().getState() == State2.START_VERTEX
                     && incomingMsg.getFlag() == Message.STOP) {
-                getVertexValue().setState(State.FINAL_VERTEX);
+                getVertexValue().setState(State2.FINAL_VERTEX);
                 //String source = getVertexValue().getKmer().toString();
                 //System.out.println();
-            } else if(getVertexValue().getState() == State.PSEUDOHEAD
+            } else if(getVertexValue().getState() == State2.PSEUDOHEAD
                     && incomingMsg.getFlag() == Message.STOP)
-                getVertexValue().setState(State.END_VERTEX);
+                getVertexValue().setState(State2.END_VERTEX);
         }
     }
     /**
      * 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() == State2.PSEUDOHEAD || getVertexValue().getState() == State2.PSEUDOREAR) {
+            getVertexValue().setState(State2.NON_VERTEX);
         }
-        if(getVertexValue().getState() == State.START_HALT)
-            getVertexValue().setState(State.START_VERTEX);
+        if(getVertexValue().getState() == State2.START_HALT)
+            getVertexValue().setState(State2.START_VERTEX);
     }
 
     @Override
@@ -388,7 +388,7 @@
             finalProcessPartitionPhase(msgIterator);
         } else if (getSuperstep() % 2 == 1 && getSuperstep() <= maxIteration) {
             resetState();
-            if(getVertexValue().getState() == State.START_VERTEX)
+            if(getVertexValue().getState() == State2.START_VERTEX)
                 sendMsgToPathVertexMergePhase(msgIterator);
             voteToHalt();
         } else if (getSuperstep() % 2 == 0 && getSuperstep() <= maxIteration) {
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 e702bbd..d0a6da2 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
@@ -11,6 +11,7 @@
 import edu.uci.ics.genomix.pregelix.format.NaiveAlgorithmForPathMergeOutputFormat;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
 
 /*
@@ -85,7 +86,7 @@
         outFlag = (byte)0;
         inFlag = (byte)0;
         // Node may be marked as head b/c it's a real head or a real tail
-        headFlag = (byte) (MessageFlag.IS_HEAD & getVertexValue().getState());
+        headFlag = (byte) (State.IS_HEAD & getVertexValue().getState());
         outgoingMsg.reset();
     }
 
@@ -101,7 +102,7 @@
      * 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(headFlag > 0 && (getVertexValue().getState() & MessageFlag.SHOULD_MERGEWITHPREV) > 0){
+        if(headFlag > 0 && (getVertexValue().getState() & State.SHOULD_MERGEWITHPREV) > 0){
             return false;
         }
         if (value.getFFList().getCountOfPosition() > 0) {
@@ -121,7 +122,7 @@
      * 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(headFlag > 0 && (getVertexValue().getState() & MessageFlag.SHOULD_MERGEWITHNEXT) > 0){
+        if(headFlag > 0 && (getVertexValue().getState() & State.SHOULD_MERGEWITHNEXT) > 0){
             return false;
         }
         if (value.getRRList().getCountOfPosition() > 0) {
@@ -213,7 +214,7 @@
             //merge kmer
             while (msgIterator.hasNext()) {
                 incomingMsg = msgIterator.next();
-                selfFlag = (byte) (MessageFlag.VERTEX_MASK & getVertexValue().getState());
+                selfFlag = (byte) (State.VERTEX_MASK & getVertexValue().getState());
                 processMerge();
                 
                 //head meets head, stop
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P5ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P5ForPathMergeVertex.java
index a67d645..c8d45dc 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P5ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P5ForPathMergeVertex.java
@@ -15,9 +15,9 @@
 import edu.uci.ics.genomix.pregelix.format.NaiveAlgorithmForPathMergeOutputFormat;
 import edu.uci.ics.genomix.pregelix.io.MessageWritable;
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.pregelix.type.Message;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.type.State;
 import edu.uci.ics.genomix.pregelix.util.VertexUtil;
 
 /*
@@ -242,7 +242,7 @@
     public void setState() {
         if (incomingMsg.getFlag() == Message.START) {
             getVertexValue().setState(MessageFlag.IS_HEAD); //State.START_VERTEX
-        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State.START_VERTEX) {
+        } else if (incomingMsg.getFlag() == Message.END && getVertexValue().getState() != State.IS_HEAD) {
             getVertexValue().setState(MessageFlag.IS_HEAD);
             getVertexValue().setKmer(getVertexValue().getKmer());
             //voteToHalt();
@@ -432,8 +432,8 @@
             initState(msgIterator);
         else if (getSuperstep() % 4 == 3){
             // Node may be marked as head b/c it's a real head or a real tail
-            headFlag = (byte) (State.START_VERTEX & getVertexValue().getState());
-            tailFlag = (byte) (State.END_VERTEX & getVertexValue().getState());
+            headFlag = (byte) (State.IS_HEAD & getVertexValue().getState());
+            tailFlag = (byte) (State.IS_HEAD & getVertexValue().getState()); //is_tail
             outFlag = (byte) (headFlag | tailFlag);
             
             // only PATH vertices are present. Find the ID's for my neighbors
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ConvertNodeToIdValue.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ConvertNodeToIdValue.java
index 9c20ce6..515bdbf 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ConvertNodeToIdValue.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/ConvertNodeToIdValue.java
@@ -12,7 +12,8 @@
 import org.apache.hadoop.io.SequenceFile.CompressionType;
 
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
+
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 
@@ -39,7 +40,7 @@
             outputValue.setRFList(node.getRFList());
             outputValue.setRRList(node.getRRList());
             outputValue.setKmer(node.getKmer());
-            outputValue.setState(State.NON_VERTEX);
+            outputValue.setState(State.IS_HEAD);
             writer.append(outputKey, outputValue);
         }
         writer.close();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
index f31c1d0..9d7b735 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/sequencefile/GenerateTextFile.java
@@ -13,7 +13,7 @@
 import org.apache.hadoop.io.SequenceFile;
 
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.PositionWritable;
 
@@ -85,7 +85,7 @@
                     break;
                 }
                 if (value.getLengthOfKmer() != -1 && value.getLengthOfKmer() <= maxLength
-                        && value.getState() == State.FINAL_VERTEX) {
+                        && value.getState() == State.IS_FINAL) {
                     bw.write(key.toString() + "\t" + value.toString());
                     bw.newLine();
                 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/DirectionFlag.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/DirectionFlag.java
new file mode 100644
index 0000000..6e1bc4b
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/DirectionFlag.java
@@ -0,0 +1,12 @@
+package edu.uci.ics.genomix.pregelix.type;
+
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
+
+public class DirectionFlag extends State {
+    public static final byte DIR_NO = 0b000 << 0;
+    public static final byte DIR_FF = 0b001 << 0;
+    public static final byte DIR_FR = 0b010 << 0;
+    public static final byte DIR_RF = 0b011 << 0;
+    public static final byte DIR_RR = 0b100 << 0;
+    public static final byte DIR_MASK = 0b111 << 0;
+}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
index 09ea917..7b1b4e5 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
@@ -1,8 +1,6 @@
 package edu.uci.ics.genomix.pregelix.type;
 
-import edu.uci.ics.genomix.type.NodeWritable.MergeDirFlag;
-
-public class MessageFlag extends MergeDirFlag {
+public class MessageFlag extends DirectionFlag {
     
     //public static final byte FLIP = 1 << 6;
 
@@ -12,3 +10,5 @@
         return "ERROR_BAD_MESSAGE";
     }
 }
+
+
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/State2.java
similarity index 98%
rename from genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State.java
rename to genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/State2.java
index 6730299..aa22972 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/State2.java
@@ -1,6 +1,6 @@
 package edu.uci.ics.genomix.pregelix.type;
 
-public class State {
+public class State2 {
 
     public static final byte NON_VERTEX = 0;
     public static final byte START_VERTEX = 1;
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
index 499abdc..e8ca60f 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/pathmerge/MergePathTest.java
@@ -13,7 +13,7 @@
 import org.junit.Test;
 
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.type.State;
+import edu.uci.ics.genomix.pregelix.type.State2;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 
 public class MergePathTest {
@@ -57,7 +57,7 @@
                 if (key == null || value == null) {
                     break;
                 }
-                if (value.getState() == State.FINAL_VERTEX) {
+                if (value.getState() == State2.FINAL_VERTEX) {
                     /*bw.write(value.getMergeChain().toString()
                     		+ "\t" + GeneCode.getSymbolFromBitMap(value.getAdjMap()));
                     bw.newLine();*/