adapt new NodeWritable and extends it in VertexValue
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 4f1e0ef..533819b 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
@@ -26,10 +26,10 @@
     // connections within the same read -- used for resolving repeats and scaffolding
     private PositionListWritable threads[] = {null, null, null, null};
     
-    private PositionListWritable startReads;  // first kmer in read (or last but kmer was flipped)
-    private PositionListWritable endReads;  //last kmer in read (or first but kmer was flipped)
+    private PositionListWritable startReads;  // first internalKmer in read (or last but internalKmer was flipped)
+    private PositionListWritable endReads;  //last internalKmer in read (or first but internalKmer was flipped)
     
-    private VKmerBytesWritable kmer;
+    private VKmerBytesWritable internalKmer;
     private float averageCoverage;
     
     // merge/update directions
@@ -53,7 +53,7 @@
         }
         startReads = new PositionListWritable();
         endReads = new PositionListWritable();
-        kmer = new VKmerBytesWritable();  // in graph construction - not set kmerlength Optimization: VKmer
+        internalKmer = new VKmerBytesWritable();  // in graph construction - not set kmerlength Optimization: VKmer
         averageCoverage = 0;
     }
     
@@ -65,7 +65,7 @@
     }
     
     public void set(NodeWritable node){
-        set(node.edges, node.threads, node.startReads, node.endReads, node.kmer, node.averageCoverage);
+        set(node.edges, node.threads, node.startReads, node.endReads, node.internalKmer, node.averageCoverage);
     }
     
     public void set(VKmerListWritable[] edges, PositionListWritable[] threads,
@@ -77,7 +77,7 @@
         }
         this.startReads.set(startReads);
         this.endReads.set(endReads);
-        this.kmer.setAsCopy(kmer2);
+        this.internalKmer.setAsCopy(kmer2);
         this.averageCoverage = coverage;
     }
 
@@ -88,20 +88,20 @@
         }
         startReads.reset();
         endReads.reset();
-        kmer.reset(0);
+        internalKmer.reset(0);
         averageCoverage = 0;
     }
-
-    public VKmerBytesWritable getKmer() {
-        return kmer;
-    }
-
-    public void setKmer(VKmerBytesWritable kmer) {
-        this.kmer.setAsCopy(kmer);
-    }
     
+    public VKmerBytesWritable getInternalKmer() {
+        return internalKmer;
+    }
+
+    public void setInternalKmer(VKmerBytesWritable internalKmer) {
+        this.internalKmer.setAsCopy(internalKmer);
+    }
+
     public int getKmerLength() {
-        return kmer.getKmerLetterLength();
+        return internalKmer.getKmerLetterLength();
     }
     
     public VKmerListWritable getEdgeList(byte dir) {
@@ -125,10 +125,10 @@
 	 */
 	public void mergeCoverage(NodeWritable other) {
 	    // sequence considered in the average doesn't include anything overlapping with other kmers
-	    float adjustedLength = kmer.getKmerLetterLength() + other.kmer.getKmerLetterLength() - (KmerBytesWritable.getKmerLength() - 1) * 2;
+	    float adjustedLength = internalKmer.getKmerLetterLength() + other.internalKmer.getKmerLetterLength() - (KmerBytesWritable.getKmerLength() - 1) * 2;
 	    
-	    float myCount = (kmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1) * averageCoverage;
-	    float otherCount = (other.kmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1) * other.averageCoverage;
+	    float myCount = (internalKmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1) * averageCoverage;
+	    float otherCount = (other.internalKmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1) * other.averageCoverage;
 	    averageCoverage = (myCount + otherCount) / adjustedLength;
 	}
 	
@@ -136,8 +136,8 @@
 	 * Update my coverage as if all the reads in other became my own 
 	 */
 	public void addCoverage(NodeWritable other) {
-	    float myAdjustedLength = kmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1;
-	    float otherAdjustedLength = other.kmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1; 
+	    float myAdjustedLength = internalKmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1;
+	    float otherAdjustedLength = other.internalKmer.getKmerLetterLength() - KmerBytesWritable.getKmerLength() - 1; 
 	    averageCoverage += other.averageCoverage * (otherAdjustedLength / myAdjustedLength);
 	}
 	
@@ -174,7 +174,7 @@
 	        length += edges[d].getLength();
 	        length += threads[d].getLength();
 	    }
-	    length += kmer.getLength() + SIZE_FLOAT;
+	    length += internalKmer.getLength() + SIZE_FLOAT;
 	    return length;
 	}
 	
@@ -202,8 +202,8 @@
         curOffset += startReads.getLength();
         endReads.set(data, curOffset);
         curOffset += endReads.getLength();
-        kmer.setAsCopy(data, curOffset);
-        curOffset += kmer.getLength();
+        internalKmer.setAsCopy(data, curOffset);
+        curOffset += internalKmer.getLength();
         averageCoverage = Marshal.getFloat(data, curOffset);
     }
     
@@ -222,8 +222,8 @@
         endReads.setNewReference(data, curOffset);
         curOffset += endReads.getLength();
         
-        kmer.setAsReference(data, curOffset);        
-        curOffset += kmer.getLength();
+        internalKmer.setAsReference(data, curOffset);        
+        curOffset += internalKmer.getLength();
         averageCoverage = Marshal.getFloat(data, curOffset);
     }
 	
@@ -237,7 +237,7 @@
         }
         startReads.write(out);
         endReads.write(out);
-        this.kmer.write(out);
+        this.internalKmer.write(out);
         out.writeFloat(averageCoverage);
     }
 
@@ -252,13 +252,13 @@
         }
         startReads.readFields(in);
         endReads.readFields(in);
-        this.kmer.readFields(in);
+        this.internalKmer.readFields(in);
         averageCoverage = in.readFloat();
     }
 
     @Override
     public int compareTo(NodeWritable other) {
-        return this.kmer.compareTo(other.kmer);
+        return this.internalKmer.compareTo(other.internalKmer);
     }
     
     public class SortByCoverage implements Comparator<NodeWritable> {
@@ -270,7 +270,7 @@
     
     @Override
     public int hashCode() {
-        return this.kmer.hashCode();
+        return this.internalKmer.hashCode();
     }
     
     @Override
@@ -283,7 +283,7 @@
             if (!edges[d].equals(nw.edges[d]) || !threads[d].equals(nw.threads[d]))
                 return false;
         }
-        return averageCoverage == nw.averageCoverage && kmer.equals(nw.kmer);
+        return averageCoverage == nw.averageCoverage && internalKmer.equals(nw.internalKmer);
     }
     
     @Override
@@ -296,7 +296,7 @@
         for (byte d: DirectionFlag.values) {
             sbuilder.append(threads[d].toString()).append('\t');
         }
-        sbuilder.append(kmer.toString()).append('\t');
+        sbuilder.append(internalKmer.toString()).append('\t');
         sbuilder.append(averageCoverage).append('x').append('}');
         return sbuilder.toString();
     }
@@ -304,13 +304,13 @@
     public void mergeForwardNext(final NodeWritable nextNode, int initialKmerSize) {
         edges[DirectionFlag.DIR_FF].setCopy(nextNode.edges[DirectionFlag.DIR_FF]);
         edges[DirectionFlag.DIR_FR].setCopy(nextNode.edges[DirectionFlag.DIR_FR]);
-        kmer.mergeWithFFKmer(initialKmerSize, nextNode.getKmer());
+        internalKmer.mergeWithFFKmer(initialKmerSize, nextNode.getInternalKmer());
     }
 
     public void mergeForwardPre(final NodeWritable preNode, int initialKmerSize) {
         edges[DirectionFlag.DIR_RF].setCopy(preNode.edges[DirectionFlag.DIR_RF]);
         edges[DirectionFlag.DIR_RR].setCopy(preNode.edges[DirectionFlag.DIR_RR]);
-        kmer.mergeWithRRKmer(initialKmerSize, preNode.getKmer());
+        internalKmer.mergeWithRRKmer(initialKmerSize, preNode.getInternalKmer());
     }
     
     public int inDegree() {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
index 29e27b9..aae1660 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
@@ -75,8 +75,7 @@
             vertexValue.setFRList(node.getEdgeList(DirectionFlag.DIR_FR));
             vertexValue.setRFList(node.getEdgeList(DirectionFlag.DIR_RF));
             vertexValue.setRRList(node.getEdgeList(DirectionFlag.DIR_RR));
-            // TODO make this more efficient (don't use toString)
-            vertexValue.setActualKmer(new VKmerBytesWritable(vertexId));
+            vertexValue.setInternalKmer(new VKmerBytesWritable(vertexId));
             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 237d9ce..3036c2e 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
@@ -1,14 +1,14 @@
 package edu.uci.ics.genomix.pregelix.io;
 
 import java.io.*;
-import org.apache.hadoop.io.WritableComparable;
 
-import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.genomix.pregelix.type.MessageFlag;
+import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerListWritable;
 
-public class VertexValueWritable implements WritableComparable<VertexValueWritable>, Serializable {
+public class VertexValueWritable 
+    extends NodeWritable{
 
     private static final long serialVersionUID = 1L;
 
@@ -46,135 +46,75 @@
         public static final byte FAKEFLAG_MASK = (byte) 00000001;
     }
     
-    private PositionListWritable nodeIdList;
-    private AdjacencyListWritable incomingList;
-    private AdjacencyListWritable outgoingList;
-    private VKmerBytesWritable actualKmer;
-    private float averageCoverage;
     private byte state;
     private boolean isFakeVertex = false;
     private HashMapWritable<VKmerBytesWritable, VKmerListWritable> traverseMap = new HashMapWritable<VKmerBytesWritable, VKmerListWritable>();
 
     public VertexValueWritable() {
-        this(0);
+        
     }
     
-    public VertexValueWritable(int kmerSize){
-        nodeIdList = new PositionListWritable();
-        incomingList = new AdjacencyListWritable();
-        outgoingList = new AdjacencyListWritable();
-        actualKmer = new VKmerBytesWritable();
-        state = State.IS_NON;
-        averageCoverage = 0;
-    }
-
-    public VertexValueWritable(PositionListWritable nodeIdList, VKmerListWritable forwardForwardList, VKmerListWritable forwardReverseList,
-            VKmerListWritable reverseForwardList, VKmerListWritable reverseReverseList, VKmerBytesWritable actualKmer,
-            float averageCoverage, byte state) {
-        set(nodeIdList, forwardForwardList, forwardReverseList, 
-                reverseForwardList, reverseReverseList, actualKmer,
-                averageCoverage, state);
-    }
-    
-    public void set(PositionListWritable nodeIdList, VKmerListWritable forwardForwardList, VKmerListWritable forwardReverseList,
-            VKmerListWritable reverseForwardList, VKmerListWritable reverseReverseList, VKmerBytesWritable actualKmer,
-            float averageCoverage, byte state) {
-        this.incomingList.setForwardList(reverseForwardList);
-        this.incomingList.setReverseList(reverseReverseList);
-        this.outgoingList.setForwardList(forwardForwardList);
-        this.outgoingList.setReverseList(forwardReverseList);
-        this.actualKmer.setAsCopy(actualKmer);
-        this.averageCoverage = averageCoverage;
-        this.state = state;
-    }
-    
-    public void set(VertexValueWritable value) {
-        set(value.getNodeIdList(), value.getFFList(),value.getFRList(),value.getRFList(),value.getRRList(),
-                value.getActualKmer(), value.getAverageCoverage(), value.getState());
-    }
-    
-    
-    public PositionListWritable getNodeIdList() {
-        return nodeIdList;
-    }
-    
-    //for testing 
-    public long getHeadReadId(){
-        return 1;
-    }
-
-    public void setNodeIdList(PositionListWritable nodeIdList) {
-        this.nodeIdList.set(nodeIdList);
-    }
 
     public VKmerListWritable getFFList() {
-        return outgoingList.getForwardList();
+        return getEdgeList(DirectionFlag.DIR_FF);
     }
 
     public VKmerListWritable getFRList() {
-        return outgoingList.getReverseList();
+        return getEdgeList(DirectionFlag.DIR_FR);
     }
 
     public VKmerListWritable getRFList() {
-        return incomingList.getForwardList();
+        return getEdgeList(DirectionFlag.DIR_RF);
     }
 
     public VKmerListWritable getRRList() {
-        return incomingList.getReverseList();
+        return getEdgeList(DirectionFlag.DIR_RR);
     }
     
     public void setFFList(VKmerListWritable forwardForwardList){
-        outgoingList.setForwardList(forwardForwardList);
+        setEdgeList(DirectionFlag.DIR_FF, forwardForwardList);
     }
     
     public void setFRList(VKmerListWritable forwardReverseList){
-        outgoingList.setReverseList(forwardReverseList);
+        setEdgeList(DirectionFlag.DIR_FR, forwardReverseList);
     }
     
     public void setRFList(VKmerListWritable reverseForwardList){
-        incomingList.setForwardList(reverseForwardList);
+        setEdgeList(DirectionFlag.DIR_RF, reverseForwardList);
     }
 
     public void setRRList(VKmerListWritable reverseReverseList){
-        incomingList.setReverseList(reverseReverseList);
+        setEdgeList(DirectionFlag.DIR_RR, reverseReverseList);
     }
     
     public AdjacencyListWritable getIncomingList() {
+        AdjacencyListWritable incomingList = new AdjacencyListWritable();
+        incomingList.setForwardList(getRFList());
+        incomingList.setReverseList(getRRList());
         return incomingList;
     }
 
     public void setIncomingList(AdjacencyListWritable incomingList) {
-        this.incomingList.set(incomingList);
+        this.setRFList(incomingList.getForwardList());
+        this.setRRList(incomingList.getReverseList());
     }
 
     public AdjacencyListWritable getOutgoingList() {
+        AdjacencyListWritable outgoingList = new AdjacencyListWritable();
+        outgoingList.setForwardList(getFFList());
+        outgoingList.setReverseList(getFRList());
         return outgoingList;
     }
 
     public void setOutgoingList(AdjacencyListWritable outgoingList) {
-        this.outgoingList.set(outgoingList);
+        this.setFFList(outgoingList.getForwardList());
+        this.setFRList(outgoingList.getReverseList());
     }
 
     public byte getState() {
         return state;
     }
-    
-    public VKmerBytesWritable getActualKmer() {
-        return actualKmer;
-    }
-
-    public void setActualKmer(VKmerBytesWritable kmer) {
-        this.actualKmer.setAsCopy(kmer);
-    }
-
-    public float getAverageCoverage() {
-        return averageCoverage;
-    }
-
-    public void setAverageCoverage(float averageCoverage) {
-        this.averageCoverage = averageCoverage;
-    }
-
+ 
     public boolean isFakeVertex() {
         return isFakeVertex;
     }
@@ -186,11 +126,6 @@
     public void setState(byte state) {
         this.state = state;
     }
-
-    public int getLengthOfKmer() {
-        return actualKmer.getKmerLetterLength();
-    }
-    
     
     public HashMapWritable<VKmerBytesWritable, VKmerListWritable> getTraverseMap() {
         return traverseMap;
@@ -201,29 +136,19 @@
     }
 
     public void reset() {
-        this.reset(0);
+        super.reset();
+        this.state = 0;
+        this.isFakeVertex = false;
+        this.traverseMap.clear();
     }
     
-    public void reset(int kmerSize) {
-        this.nodeIdList.reset();
-        this.incomingList.getForwardList().reset();
-        this.incomingList.getReverseList().reset();
-        this.outgoingList.getForwardList().reset();
-        this.outgoingList.getReverseList().reset();
-        this.actualKmer.reset(0);
-        averageCoverage = 0;
-    }
+//    public void reset(int kmerSize) {
+//    }
     
     @Override
     public void readFields(DataInput in) throws IOException {
         reset();
-        this.nodeIdList.readFields(in);
-        this.outgoingList.getForwardList().readFields(in);
-        this.outgoingList.getReverseList().readFields(in);
-        this.incomingList.getForwardList().readFields(in);
-        this.incomingList.getReverseList().readFields(in);
-        this.actualKmer.readFields(in);
-        averageCoverage = in.readFloat();
+        super.readFields(in);
         this.state = in.readByte();
         this.isFakeVertex = in.readBoolean();
         this.traverseMap.readFields(in);
@@ -231,42 +156,18 @@
 
     @Override
     public void write(DataOutput out) throws IOException {
-        this.nodeIdList.write(out);
-        this.outgoingList.getForwardList().write(out);
-        this.outgoingList.getReverseList().write(out);
-        this.incomingList.getForwardList().write(out);
-        this.incomingList.getReverseList().write(out);
-        this.actualKmer.write(out);
-        out.writeFloat(averageCoverage);
+        super.write(out);
         out.writeByte(this.state);
         out.writeBoolean(this.isFakeVertex);
         this.traverseMap.write(out);
     }
-
-    @Override
-    public int compareTo(VertexValueWritable o) {
-        return 0;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sbuilder = new StringBuilder();
-        sbuilder.append('{');
-        sbuilder.append(nodeIdList.toString()).append('\t');
-        sbuilder.append(outgoingList.getForwardList().toString()).append('\t');
-        sbuilder.append(outgoingList.getReverseList().toString()).append('\t');
-        sbuilder.append(incomingList.getForwardList().toString()).append('\t');
-        sbuilder.append(incomingList.getReverseList().toString()).append('\t');
-        sbuilder.append(actualKmer.toString()).append('}');
-        return sbuilder.toString();
-    }
     
     public int inDegree(){
-        return incomingList.getForwardList().getCountOfPosition() + incomingList.getReverseList().getCountOfPosition();
+        return getRFList().getCountOfPosition() + getRRList().getCountOfPosition();
     }
     
     public int outDegree(){
-        return outgoingList.getForwardList().getCountOfPosition() + outgoingList.getReverseList().getCountOfPosition();
+        return getFFList().getCountOfPosition() + getFRList().getCountOfPosition();
     }
     
     public int getDegree(){
@@ -277,20 +178,8 @@
      * Delete the corresponding edge
      */
     public void processDelete(byte neighborToDeleteDir, VKmerBytesWritable nodeToDelete){
-        switch (neighborToDeleteDir & MessageFlag.DIR_MASK) {
-            case MessageFlag.DIR_FF:
-                this.getFFList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_FR:
-                this.getFRList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_RF:
-                this.getRFList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_RR:
-                this.getRRList().remove(nodeToDelete);
-                break;
-        }
+        byte dir = (byte)(neighborToDeleteDir & MessageFlag.DIR_MASK);
+        this.getEdgeList(dir).remove(nodeToDelete);
     }
     
     /*
@@ -298,38 +187,11 @@
      */
     public void processUpdates(byte neighborToDeleteDir, VKmerBytesWritable nodeToDelete,
             byte neighborToMergeDir, VKmerBytesWritable nodeToAdd){
-//        TODO
-//        this.getListFromDir(neighborToDeleteDir).remove(nodeToDelete);
-//        this.getListFromDir(neighborToMergeDir).append(nodeToDelete);
+        byte deleteDir = (byte)(neighborToDeleteDir & MessageFlag.DIR_MASK);
+        this.getEdgeList(deleteDir).remove(nodeToDelete);
         
-        switch (neighborToDeleteDir & MessageFlag.DIR_MASK) {
-            case MessageFlag.DIR_FF:
-                this.getFFList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_FR:
-                this.getFRList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_RF:
-                this.getRFList().remove(nodeToDelete);
-                break;
-            case MessageFlag.DIR_RR:
-                this.getRRList().remove(nodeToDelete);
-                break;
-        }
-        switch (neighborToMergeDir & MessageFlag.DIR_MASK) {
-            case MessageFlag.DIR_FF:
-                this.getFFList().append(nodeToAdd);
-                break;
-            case MessageFlag.DIR_FR:
-                this.getFRList().append(nodeToAdd);
-                break;
-            case MessageFlag.DIR_RF:
-                this.getRFList().append(nodeToAdd);
-                break;
-            case MessageFlag.DIR_RR:
-                this.getRRList().append(nodeToAdd);
-                break;
-        }
+        byte mergeDir = (byte)(neighborToMergeDir & MessageFlag.DIR_MASK);
+        this.getEdgeList(mergeDir).append(nodeToAdd);
     }
     
     /*
@@ -338,41 +200,13 @@
     public void processMerges(byte neighborToDeleteDir, VKmerBytesWritable nodeToDelete,
             byte neighborToMergeDir, VKmerBytesWritable nodeToAdd, 
             int kmerSize, VKmerBytesWritable kmer){
-        switch (neighborToDeleteDir & MessageFlag.DIR_MASK) {
-            case MessageFlag.DIR_FF:
-                this.getFFList().remove(nodeToDelete); //set(null);
-                this.getActualKmer().mergeWithFFKmer(kmerSize, kmer);
-                break;
-            case MessageFlag.DIR_FR:
-                this.getFRList().remove(nodeToDelete);
-                this.getActualKmer().mergeWithFRKmer(kmerSize, kmer);
-                break;
-            case MessageFlag.DIR_RF:
-                this.getRFList().remove(nodeToDelete);
-                this.getActualKmer().mergeWithRFKmer(kmerSize, kmer);
-                break;
-            case MessageFlag.DIR_RR:
-                this.getRRList().remove(nodeToDelete);
-                this.getActualKmer().mergeWithRRKmer(kmerSize, kmer);
-                break;
-        }
-        // TODO: remove switch below and replace with general direction merge
-//        this.getKmer().mergeWithDirKmer(neighborToMergeDir);
-        if(nodeToAdd != null){ //if null, nodeToAdd is empty and so another node may be head or tail
-            switch (neighborToMergeDir & MessageFlag.DIR_MASK) {
-                case MessageFlag.DIR_FF:
-                    this.getFFList().append(nodeToAdd);
-                    break;
-                case MessageFlag.DIR_FR:
-                    this.getFRList().append(nodeToAdd);
-                    break;
-                case MessageFlag.DIR_RF:
-                    this.getRFList().append(nodeToAdd);
-                    break;
-                case MessageFlag.DIR_RR:
-                    this.getRRList().append(nodeToAdd);
-                    break;
-            }
+        byte deleteDir = (byte)(neighborToDeleteDir & MessageFlag.DIR_MASK);
+        this.getEdgeList(deleteDir).remove(nodeToDelete);
+        this.getInternalKmer().mergeWithKmerInDir(deleteDir, kmerSize, kmer);
+        
+        if(nodeToAdd != null){
+            byte mergeDir = (byte)(neighborToMergeDir & MessageFlag.DIR_MASK);
+            this.getEdgeList(mergeDir).append(nodeToAdd);
         }
     }
     
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
index 13a6223..03ed1de 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
@@ -81,7 +81,7 @@
                 Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
                 vertex.getMsgList().clear();
                 vertex.getEdges().clear();
-                VertexValueWritable vertexValue = new VertexValueWritable(kmerSize);
+                VertexValueWritable vertexValue = new VertexValueWritable(); //kmerSize
                 /**
                  * set the src vertex id
                  */
@@ -98,7 +98,7 @@
                 VKmerListWritable kmerRFList = new VKmerListWritable();
                 kmerRFList.append(otherVertexId);
                 vertexValue.setRFList(kmerRFList);
-                vertexValue.setActualKmer(vertexId);
+                vertexValue.setInternalKmer(vertexId);
                 vertex.setVertexValue(vertexValue);
                 
                 addVertex(vertexId, vertex);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeRemoveVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeRemoveVertex.java
index 50b1518..2175336 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeRemoveVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeRemoveVertex.java
@@ -91,7 +91,7 @@
                 i++;
             }
             if(receivedMsgList.size() == 2){
-                if(getVertexValue().getLengthOfKmer() <= length 
+                if(getVertexValue().getKmerLength() <= length 
                         && getVertexValue().getDegree() == 2){
                     broadcaseKillself();
                 }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
index aca9d95..89c73c9 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
@@ -74,7 +74,7 @@
                 Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
                 vertex.getMsgList().clear();
                 vertex.getEdges().clear();
-                VertexValueWritable vertexValue = new VertexValueWritable(kmerSize);
+                VertexValueWritable vertexValue = new VertexValueWritable(); //kmerSize
                 /**
                  * set the src vertex id
                  */
@@ -91,7 +91,7 @@
                 VKmerListWritable kmerRFList = new VKmerListWritable();
                 kmerRFList.append(otherVertexId);
                 vertexValue.setRFList(kmerRFList);
-                vertexValue.setActualKmer(vertexId);
+                vertexValue.setInternalKmer(vertexId);
 
                 vertex.setVertexValue(vertexValue);
                 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
index c97244a..2937058 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
@@ -62,7 +62,7 @@
                 if(hasNextDest(getVertexValue())){
                     outgoingMsg.setStartVertexId(incomingMsg.getSourceVertexId());
                     outgoingMsg.setSourceVertexId(getVertexId());
-                    outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                    outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                     destVertexId.setAsCopy(getNextDestVertexId(getVertexValue()));
                     sendMsg(destVertexId, outgoingMsg);
                 }
@@ -72,7 +72,7 @@
                 if(hasPrevDest(getVertexValue())){
                     outgoingMsg.setStartVertexId(incomingMsg.getSourceVertexId());
                     outgoingMsg.setSourceVertexId(getVertexId());
-                    outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                    outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                     destVertexId.setAsCopy(getPrevDestVertexId(getVertexValue()));
                     sendMsg(destVertexId, outgoingMsg);
                 }
@@ -182,7 +182,7 @@
                     broadcaseKillself();
                 } else if(incomingMsg.getFlag() == MessageFlag.UNCHANGE){
                     /** update average coverage **/
-                    getVertexValue().setAverageCoverage(incomingMsg.getAverageCoverage());
+                    getVertexValue().setAvgCoverage(incomingMsg.getAverageCoverage());
                 }
             }
         } else if(getSuperstep() == 5){
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicGraphCleanVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicGraphCleanVertex.java
index d0d1ce9..4c4483e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicGraphCleanVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicGraphCleanVertex.java
@@ -238,22 +238,22 @@
      */
     public void startSendMsg() {
         if (VertexUtil.isHeadVertexWithIndegree(getVertexValue())) {
-            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));//| MessageFlag.HEAD_SHOULD_MERGEWITHNEXT
+            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));
             sendMsgToAllNextNodes(getVertexValue());
             voteToHalt();
         }
         if (VertexUtil.isRearVertexWithOutdegree(getVertexValue())) {
-            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));//| MessageFlag.HEAD_SHOULD_MERGEWITHPREV
+            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));
             sendMsgToAllPreviousNodes(getVertexValue());
             voteToHalt();
         }
         if (VertexUtil.isHeadWithoutIndegree(getVertexValue())){
-            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));//| MessageFlag.HEAD_SHOULD_MERGEWITHNEXT
+            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));
             sendMsg(getVertexId(), outgoingMsg); //send to itself
             voteToHalt();
         }
         if (VertexUtil.isRearWithoutOutdegree(getVertexValue())){
-            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));//| MessageFlag.HEAD_SHOULD_MERGEWITHPREV
+            outgoingMsg.setFlag((byte)(MessageFlag.IS_HEAD));
             sendMsg(getVertexId(), outgoingMsg); //send to itself
             voteToHalt();
         }
@@ -308,8 +308,6 @@
             outFlag |= MessageFlag.DIR_FF;
         else if(getVertexValue().getFRList().getCountOfPosition() > 0)
             outFlag |= MessageFlag.DIR_FR;
-//        else
-//            outFlag |= MessageFlag.DIR_NO;
     }
     
     /**
@@ -321,8 +319,6 @@
             outFlag |= MessageFlag.DIR_RF;
         else if(getVertexValue().getRRList().getCountOfPosition() > 0)
             outFlag |= MessageFlag.DIR_RR;
-//        else
-//            outFlag |= MessageFlag.DIR_NO;
     }
     
     /**
@@ -408,7 +404,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getIncomingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg); //getNextDestVertexId(getVertexValue())
                 break;
             case MessageFlag.DIR_RF:
@@ -421,7 +417,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg); //getPreDestVertexId(getVertexValue())
                 break; 
         }
@@ -446,7 +442,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getIncomingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg); //getNextDestVertexId(getVertexValue())
                 break;
             case MessageFlag.DIR_RF:
@@ -459,7 +455,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg); //getPreDestVertexId(getVertexValue())
                 break; 
         }
@@ -482,7 +478,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getIncomingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(getNextDestVertexId(getVertexValue()), outgoingMsg);
                 deleteVertex(getVertexId());
                 break;
@@ -495,7 +491,7 @@
                 outgoingMsg.setFlag(outFlag);
                 outgoingMsg.setNeighberNode(getVertexValue().getOutgoingList());
                 outgoingMsg.setSourceVertexId(getVertexId());
-                outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+                outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
                 sendMsg(getPrevDestVertexId(getVertexValue()), outgoingMsg);
                 deleteVertex(getVertexId());
                 break; 
@@ -651,28 +647,28 @@
         int index;
         switch(neighborToMeDir){
             case MessageFlag.DIR_FF:
-                selfString = getVertexValue().getActualKmer().toString();
+                selfString = getVertexValue().getInternalKmer().toString();
                 match = selfString.substring(selfString.length() - kmerSize + 1,selfString.length()); 
                 msgString = msg.getActualKmer().toString();
                 index = msgString.indexOf(match);
                 tmpKmer.setByRead(msgString.length() - index, msgString.substring(index).getBytes(), 0);
                 break;
             case MessageFlag.DIR_FR:
-                selfString = getVertexValue().getActualKmer().toString();
+                selfString = getVertexValue().getInternalKmer().toString();
                 match = selfString.substring(selfString.length() - kmerSize + 1,selfString.length()); 
                 msgString = GeneCode.reverseComplement(msg.getActualKmer().toString());
                 index = msgString.indexOf(match);
                 tmpKmer.setByReadReverse(msgString.length() - index, msgString.substring(index).getBytes(), 0);
                 break;
             case MessageFlag.DIR_RF:
-                selfString = getVertexValue().getActualKmer().toString();
+                selfString = getVertexValue().getInternalKmer().toString();
                 match = selfString.substring(0, kmerSize - 1); 
                 msgString = GeneCode.reverseComplement(msg.getActualKmer().toString());
                 index = msgString.lastIndexOf(match) + kmerSize - 2;
                 tmpKmer.setByReadReverse(index + 1, msgString.substring(0, index + 1).getBytes(), 0);
                 break;
             case MessageFlag.DIR_RR:
-                selfString = getVertexValue().getActualKmer().toString();
+                selfString = getVertexValue().getInternalKmer().toString();
                 match = selfString.substring(0, kmerSize - 1); 
                 msgString = msg.getActualKmer().toString();
                 index = msgString.lastIndexOf(match) + kmerSize - 2;
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/MapReduceVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/MapReduceVertex.java
index 5baf492..d6ba604 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/MapReduceVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/MapReduceVertex.java
@@ -81,7 +81,7 @@
             Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
             vertex.getMsgList().clear();
             vertex.getEdges().clear();
-            VertexValueWritable vertexValue = new VertexValueWritable(kmerSize + 1);
+            VertexValueWritable vertexValue = new VertexValueWritable();//kmerSize + 1
             vertexValue.setState(State.IS_FAKE);
             vertexValue.setFakeVertex(true);
             
@@ -96,7 +96,7 @@
     public void sendMsgToFakeVertex(){
         if(!getVertexValue().isFakeVertex()){
             outgoingMsg.setSourceVertexId(getVertexId());
-            outgoingMsg.setActualKmer(getVertexValue().getActualKmer());
+            outgoingMsg.setActualKmer(getVertexValue().getInternalKmer());
             sendMsg(fakeVertex, outgoingMsg);
             voteToHalt();
         }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
index 3e822e4..3eae7b4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
@@ -33,7 +33,7 @@
     @Override
     public void compute(Iterator<MessageWritable> msgIterator) {
         initVertex(); 
-        if(getVertexValue().getAverageCoverage() < minAverageCoverage)
+        if(getVertexValue().getAvgCoverage() < minAverageCoverage)
             deleteVertex(getVertexId());
         else
             voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/ScaffoldingVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/ScaffoldingVertex.java
index be43658..782ed70 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/ScaffoldingVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/ScaffoldingVertex.java
@@ -45,8 +45,8 @@
         if(getSuperstep() == 1){
             /** add a fake vertex **/
             addFakeVertex();
-            /** grouped by 5' readId **/
-            long mainReadId = getVertexValue().getHeadReadId();
+            /** grouped by 5' readId **/ //TODO
+            long mainReadId = getVertexValue().getStartReads().getPosition(0).getReadId();
             if(mainReadId != 0){ //empty or not
                 if(scaffoldingMap.containsKey(mainReadId)){
                     kmerList.setCopy(scaffoldingMap.get(mainReadId));
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
index ee493f9..945b439 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java
@@ -153,9 +153,9 @@
     
     public void setSelfReadIdSet(){
         selfReadIdSet.clear();
-        for(PositionWritable nodeId : getVertexValue().getNodeIdList()){
-            selfReadIdSet.add(nodeId.getReadId());
-        }    
+//        for(PositionWritable nodeId : getVertexValue().getNodeIdList()){
+//            selfReadIdSet.add(nodeId.getReadId());
+//        }    
     }
     
     @SuppressWarnings({ "rawtypes", "unchecked" })
@@ -164,7 +164,7 @@
         vertex.getMsgList().clear();
         vertex.getEdges().clear();
         VKmerBytesWritable vertexId = new VKmerBytesWritable(kmerSize);
-        VertexValueWritable vertexValue = new VertexValueWritable(kmerSize);
+        VertexValueWritable vertexValue = new VertexValueWritable(); //kmerSize
         //add the corresponding edge to new vertex
         switch(connectedTable[i][0]){
             case EdgeDir.DIR_RF:
@@ -317,7 +317,7 @@
         } else if(getSuperstep() == 2){
             while(msgIterator.hasNext()){
                 incomingMsg = msgIterator.next();
-                outgoingMsg.setNodeIdList(getVertexValue().getNodeIdList());
+//                outgoingMsg.setNodeIdList(getVertexValue().getNodeIdList());
                 outgoingMsg.setSourceVertexId(getVertexId());
                 sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
             }
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
index 0738208..86406a9 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
@@ -78,7 +78,7 @@
                 vertex.getMsgList().clear();
                 vertex.getEdges().clear();
                 
-                VertexValueWritable vertexValue = new VertexValueWritable(kmerSize);
+                VertexValueWritable vertexValue = new VertexValueWritable(); //kmerSize
                 /**
                  * set the src vertex id
                  */
@@ -89,7 +89,7 @@
                 VKmerListWritable kmerList = new VKmerListWritable();
                 kmerList.append(getVertexId());
                 vertexValue.setRFList(kmerList);
-                vertexValue.setActualKmer(vertexId);
+                vertexValue.setInternalKmer(vertexId);
                 vertex.setVertexValue(vertexValue);
                 
                 addVertex(vertexId, vertex);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
index 527fb66..1594673 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
@@ -71,19 +71,19 @@
         initVertex(); 
         if(getSuperstep() == 1){
             if(VertexUtil.isIncomingTipVertex(getVertexValue())){
-            	if(getVertexValue().getLengthOfKmer() <= length){
+            	if(getVertexValue().getKmerLength() <= length){
             		sendSettledMsgToPreviousNode();
             		deleteVertex(getVertexId());
             	}
             }
             else if(VertexUtil.isOutgoingTipVertex(getVertexValue())){
-                if(getVertexValue().getLengthOfKmer() <= length){
+                if(getVertexValue().getKmerLength() <= length){
                 	sendSettledMsgToNextNode();
                     deleteVertex(getVertexId());
                 }
             }
             else if(VertexUtil.isSingleVertex(getVertexValue())){
-                if(getVertexValue().getLengthOfKmer() <= length)
+                if(getVertexValue().getKmerLength() <= length)
                     deleteVertex(getVertexId());
             }
         }
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 b3a3d37..d075fe9 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
@@ -57,7 +57,7 @@
                 if (key == null || value == null) {
                     break;
                 }
-                if (value.getLengthOfKmer() != -1 && value.getLengthOfKmer() <= maxLength) {
+                if (value.getKmerLength() != -1 && value.getKmerLength() <= maxLength) {
                     bw.write(value.toString());
                     bw.newLine();
                 }
@@ -81,7 +81,7 @@
                 if (key == null || value == null) {
                     break;
                 }
-                if (value.getLengthOfKmer() != -1 && value.getLengthOfKmer() <= maxLength
+                if (value.getKmerLength() != -1 && value.getKmerLength() <= maxLength
                         && value.getState() == State.IS_FINAL) {
                     bw.write(key.toString() + "\t" + value.toString());
                     bw.newLine();