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();
