diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/KmerUtil.java
similarity index 95%
rename from genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java
rename to genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/KmerUtil.java
index 68dec30..5dc04e0 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/KmerUtil.java
@@ -13,7 +13,9 @@
  * limitations under the License.
  */
 
-package edu.uci.ics.genomix.type;
+package edu.uci.ics.genomix.data;
+
+import edu.uci.ics.genomix.type.GeneCode;
 
 public class KmerUtil {
     public static final String empty = "";
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java
new file mode 100644
index 0000000..219def6
--- /dev/null
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java
@@ -0,0 +1,15 @@
+package edu.uci.ics.genomix.data;
+
+public class Marshal {
+    public static int getInt(byte[] bytes, int offset) {
+        return ((bytes[offset] & 0xff) << 24) + ((bytes[offset + 1] & 0xff) << 16) + ((bytes[offset + 2] & 0xff) << 8)
+                + ((bytes[offset + 3] & 0xff) << 0);
+    }
+    
+    public static void putInt(int val, byte[] bytes, int offset) {
+        bytes[offset] = (byte)((val >>> 24) & 0xFF);        
+        bytes[offset + 1] = (byte)((val >>> 16) & 0xFF);
+        bytes[offset + 2] = (byte)((val >>>  8) & 0xFF);
+        bytes[offset + 3] = (byte)((val >>>  0) & 0xFF);
+    }
+}
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
index 7e578f6..bbe4419 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
@@ -24,6 +24,8 @@
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
 
+import edu.uci.ics.genomix.data.KmerUtil;
+
 /**
  * Variable kmer length byteswritable
  * It was used to generate the graph in which phase the kmer length doesn't change.
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 cbff5a6..6b3be5f 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
@@ -1,20 +1,36 @@
 package edu.uci.ics.genomix.type;
 
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
 
-public class NodeWritable {
+import org.apache.hadoop.io.WritableComparable;
+
+public class NodeWritable implements WritableComparable<NodeWritable> {
     private PositionWritable nodeID;
     private int countOfKmer;
     private PositionListWritable incomingList;
     private PositionListWritable outgoingList;
-
-    public NodeWritable() {
+    private KmerBytesWritable kmer;
+    
+    @SuppressWarnings("deprecation")
+    public NodeWritable(){
         nodeID = new PositionWritable();
         countOfKmer = 0;
         incomingList = new PositionListWritable();
         outgoingList = new PositionListWritable();
+        kmer = new KmerBytesWritable();
     }
-    
-    public int getCount(){
+
+    public NodeWritable(int kmerSize) {
+        nodeID = new PositionWritable();
+        countOfKmer = 0;
+        incomingList = new PositionListWritable();
+        outgoingList = new PositionListWritable();
+        kmer = new KmerBytesWritable(kmerSize);
+    }
+
+    public int getCount() {
         return countOfKmer;
     }
 
@@ -57,11 +73,14 @@
         return nodeID;
     }
 
+    public KmerBytesWritable getKmer() {
+        return kmer;
+    }
+
     public void mergeNextWithinOneRead(NodeWritable nextNodeEntry) {
-        this.countOfKmer += nextNodeEntry.countOfKmer;
-        for(PositionWritable pos : nextNodeEntry.getOutgoingList()){
-            this.outgoingList.append(pos);
-        }
+        this.countOfKmer += 1;
+        this.outgoingList.set(nextNodeEntry.outgoingList);
+        kmer.mergeKmerWithNextCode(nextNodeEntry.kmer.getGeneCodeAtPosition(nextNodeEntry.kmer.getKmerLength() - 1));
     }
 
     public void set(NodeWritable node) {
@@ -69,6 +88,35 @@
         this.countOfKmer = node.countOfKmer;
         this.incomingList.set(node.getIncomingList());
         this.outgoingList.set(node.getOutgoingList());
+        this.kmer.set(node.kmer);
+    }
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        this.nodeID.readFields(in);
+        this.countOfKmer = in.readInt();
+        this.incomingList.readFields(in);
+        this.outgoingList.readFields(in);
+        this.kmer.readFields(in);
+    }
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        this.nodeID.write(out);
+        out.writeInt(this.countOfKmer);
+        this.incomingList.write(out);
+        this.outgoingList.write(out);
+        this.kmer.write(out);
+    }
+
+    @Override
+    public int compareTo(NodeWritable other) {
+        return this.nodeID.compareTo(other.nodeID);
+    }
+
+    @Override
+    public int hashCode() {
+        return nodeID.hashCode();
     }
 
 }
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
index e006210..af07ed5 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
@@ -4,32 +4,35 @@
 import java.io.DataOutput;
 import java.io.IOException;
 import java.util.Iterator;
+
 import org.apache.hadoop.io.Writable;
 
-public class PositionListWritable implements Writable, Iterable<PositionWritable> {
-    private byte[] storage;
-    private int offset;
-    private int valueCount;
-    private static final byte[] EMPTY = {};
+import edu.uci.ics.genomix.data.Marshal;
 
-    private PositionWritable posIter = new PositionWritable();
+public class PositionListWritable implements Writable, Iterable<PositionWritable> {
+    protected byte[] storage;
+    protected int offset;
+    protected int valueCount;
+    protected static final byte[] EMPTY = {};
+
+    protected PositionWritable posIter = new PositionWritable();
 
     public PositionListWritable() {
         this.storage = EMPTY;
         this.valueCount = 0;
         this.offset = 0;
     }
-    
-    public PositionListWritable(int count, byte [] data, int offset){
+
+    public PositionListWritable(int count, byte[] data, int offset) {
         setNewReference(count, data, offset);
     }
 
-    public void setNewReference(int count, byte[] data, int offset){
+    public void setNewReference(int count, byte[] data, int offset) {
         this.valueCount = count;
         this.storage = data;
         this.offset = offset;
     }
-    
+
     protected void setSize(int size) {
         if (size > getCapacity()) {
             setCapacity((size * 3 / 2));
@@ -44,26 +47,13 @@
         if (new_cap > getCapacity()) {
             byte[] new_data = new byte[new_cap];
             if (storage.length - offset > 0) {
-                System.arraycopy(storage, offset, new_data, 0, storage.length-offset);
+                System.arraycopy(storage, offset, new_data, 0, storage.length - offset);
             }
             storage = new_data;
             offset = 0;
         }
     }
 
-    @Override
-    public void readFields(DataInput in) throws IOException {
-        this.valueCount = in.readInt();
-        setSize(valueCount * PositionWritable.LENGTH);
-        in.readFully(storage, offset, valueCount * PositionWritable.LENGTH);
-    }
-
-    @Override
-    public void write(DataOutput out) throws IOException {
-        out.writeInt(valueCount);
-        out.write(storage, offset, valueCount * PositionWritable.LENGTH);
-    }
-
     public PositionWritable getPosition(int i) {
         if (i >= valueCount) {
             throw new ArrayIndexOutOfBoundsException("No such positions");
@@ -71,7 +61,7 @@
         posIter.setNewReference(storage, offset + i * PositionWritable.LENGTH);
         return posIter;
     }
-    
+
     @Override
     public Iterator<PositionWritable> iterator() {
         Iterator<PositionWritable> it = new Iterator<PositionWritable>() {
@@ -114,14 +104,14 @@
 
     public void append(PositionWritable pos) {
         setSize((1 + valueCount) * PositionWritable.LENGTH);
-        System.arraycopy(pos.getByteArray(), pos.getStartOffset(), storage, offset + valueCount * PositionWritable.LENGTH,
-                pos.getLength());
+        System.arraycopy(pos.getByteArray(), pos.getStartOffset(), storage, offset + valueCount
+                * PositionWritable.LENGTH, pos.getLength());
         valueCount += 1;
     }
 
     public void append(int readID, byte posInRead) {
         setSize((1 + valueCount) * PositionWritable.LENGTH);
-        putInt(readID, storage, offset + valueCount * PositionWritable.LENGTH);
+        Marshal.putInt(readID, storage, offset + valueCount * PositionWritable.LENGTH);
         storage[offset + valueCount * PositionWritable.LENGTH + PositionWritable.INTBYTES] = posInRead;
         valueCount += 1;
     }
@@ -139,19 +129,20 @@
     }
 
     public int getLength() {
-        return valueCount * PositionWritable.LENGTH ;
+        return valueCount * PositionWritable.LENGTH;
     }
-    
-    public static int getInt(byte[] bytes, int offset) {
-        return ((bytes[offset] & 0xff) << 24) + ((bytes[offset + 1] & 0xff) << 16) + ((bytes[offset + 2] & 0xff) << 8)
-                + ((bytes[offset + 3] & 0xff) << 0);
+
+    @Override
+    public void readFields(DataInput in) throws IOException {
+        this.valueCount = in.readInt();
+        setSize(valueCount * PositionWritable.LENGTH);
+        in.readFully(storage, offset, valueCount * PositionWritable.LENGTH);
     }
-    
-    public static void putInt(int val, byte[] bytes, int offset) {
-        bytes[offset] = (byte)((val >>> 24) & 0xFF);        
-        bytes[offset + 1] = (byte)((val >>> 16) & 0xFF);
-        bytes[offset + 2] = (byte)((val >>>  8) & 0xFF);
-        bytes[offset + 3] = (byte)((val >>>  0) & 0xFF);
+
+    @Override
+    public void write(DataOutput out) throws IOException {
+        out.writeInt(valueCount);
+        out.write(storage, offset, valueCount * PositionWritable.LENGTH);
     }
 
 }
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
index d8d85ec..c7f24ec 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
@@ -3,11 +3,15 @@
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
-import org.apache.hadoop.io.Writable;
 
-public class PositionWritable implements Writable {
-    private byte[] storage;
-    private int offset;
+import org.apache.hadoop.io.WritableComparable;
+import org.apache.hadoop.io.WritableComparator;
+
+import edu.uci.ics.genomix.data.Marshal;
+
+public class PositionWritable implements WritableComparable<PositionWritable> {
+    protected byte[] storage;
+    protected int offset;
     public static final int LENGTH = 5;
     public static final int INTBYTES = 4;
 
@@ -31,12 +35,12 @@
     }
     
     public void set(int readID, byte posInRead) {
-        putInt(readID, storage, offset);
+        Marshal.putInt(readID, storage, offset);
         storage[offset + INTBYTES] = posInRead;
     }
 
     public int getReadID() {
-        return getInt(storage, offset);
+        return Marshal.getInt(storage, offset);
     }
 
     public byte getPosInRead() {
@@ -54,7 +58,7 @@
     public int getLength() {
         return LENGTH;
     }
-    
+
     @Override
     public void readFields(DataInput in) throws IOException {
         in.readFully(storage, offset, LENGTH);
@@ -65,16 +69,51 @@
         out.write(storage, offset, LENGTH);
     }
     
-    public static int getInt(byte[] bytes, int offset) {
-        return ((bytes[offset] & 0xff) << 24) + ((bytes[offset + 1] & 0xff) << 16) + ((bytes[offset + 2] & 0xff) << 8)
-                + ((bytes[offset + 3] & 0xff) << 0);
-    }
-    
-    public static void putInt(int val, byte[] bytes, int offset) {
-        bytes[offset] = (byte)((val >>> 24) & 0xFF);        
-        bytes[offset + 1] = (byte)((val >>> 16) & 0xFF);
-        bytes[offset + 2] = (byte)((val >>>  8) & 0xFF);
-        bytes[offset + 3] = (byte)((val >>>  0) & 0xFF);
+    @Override
+    public int hashCode() {
+        return this.getReadID();
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof PositionWritable))
+            return false;
+        PositionWritable other = (PositionWritable) o;
+        return this.getReadID() == other.getReadID() && this.getPosInRead() == other.getPosInRead();
+    }
+
+    @Override
+    public int compareTo(PositionWritable other) {
+        int diff = this.getReadID() - other.getReadID();
+        if (diff == 0) {
+            return this.getPosInRead() - other.getPosInRead();
+        }
+        return diff;
+    }
+
+    @Override
+    public String toString() {
+        return "(" + Integer.toString(getReadID()) + "," + Integer.toString((int) getPosInRead()) + ")";
+    }
+
+    /** A Comparator optimized for IntWritable. */
+    public static class Comparator extends WritableComparator {
+        public Comparator() {
+            super(PositionWritable.class);
+        }
+
+        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
+            int thisValue = Marshal.getInt(b1, s1);
+            int thatValue = Marshal.getInt(b2, s2);
+            int diff = thisValue - thatValue;
+            if (diff == 0) {
+                return b1[s1 + INTBYTES] - b2[s2 + INTBYTES];
+            }
+            return diff;
+        }
+    }
+
+    static { // register this comparator
+        WritableComparator.define(PositionWritable.class, new Comparator());
+    }
 }
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/NodeReference.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/NodeReference.java
index 4e99865..fcc61d5 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/NodeReference.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/NodeReference.java
@@ -1,114 +1,12 @@
 package edu.uci.ics.genomix.hyracks.data.primitive;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
+import edu.uci.ics.genomix.type.NodeWritable;
 
-import org.apache.hadoop.io.WritableComparable;
-
-import edu.uci.ics.genomix.type.KmerBytesWritable;
-
-public class NodeReference implements WritableComparable<NodeReference> {
-    private PositionReference nodeID;
-    private int countOfKmer;
-    private PositionListReference incomingList;
-    private PositionListReference outgoingList;
-    private KmerBytesWritable kmer;
+public class NodeReference extends NodeWritable{
 
     public NodeReference(int kmerSize) {
-        nodeID = new PositionReference();
-        countOfKmer = 0;
-        incomingList = new PositionListReference();
-        outgoingList = new PositionListReference();
-        kmer = new KmerBytesWritable(kmerSize);
+        super(kmerSize);
+        // TODO Auto-generated constructor stub
     }
-
-    public int getCount() {
-        return countOfKmer;
-    }
-
-    public void setCount(int count) {
-        this.countOfKmer = count;
-    }
-
-    public void setNodeID(PositionReference ref) {
-        this.setNodeID(ref.getReadID(), ref.getPosInRead());
-    }
-
-    public void setNodeID(int readID, byte posInRead) {
-        nodeID.set(readID, posInRead);
-    }
-
-    public void setIncomingList(PositionListReference incoming) {
-        incomingList.set(incoming);
-    }
-
-    public void setOutgoingList(PositionListReference outgoing) {
-        outgoingList.set(outgoing);
-    }
-
-    public void reset() {
-        nodeID.set(0, (byte) 0);
-        incomingList.reset();
-        outgoingList.reset();
-        countOfKmer = 0;
-    }
-
-    public PositionListReference getIncomingList() {
-        return incomingList;
-    }
-
-    public PositionListReference getOutgoingList() {
-        return outgoingList;
-    }
-
-    public PositionReference getNodeID() {
-        return nodeID;
-    }
-
-    public KmerBytesWritable getKmer() {
-        return kmer;
-    }
-
-    public void mergeNextWithinOneRead(NodeReference nextNodeEntry) {
-        this.countOfKmer += 1;
-        this.outgoingList.set(nextNodeEntry.outgoingList);
-        kmer.mergeKmerWithNextCode(nextNodeEntry.kmer.getGeneCodeAtPosition(nextNodeEntry.kmer.getKmerLength() - 1));
-    }
-
-    public void set(NodeReference node) {
-        this.nodeID.set(node.getNodeID().getReadID(), node.getNodeID().getPosInRead());
-        this.countOfKmer = node.countOfKmer;
-        this.incomingList.set(node.getIncomingList());
-        this.outgoingList.set(node.getOutgoingList());
-        this.kmer.set(node.kmer);
-    }
-
-    @Override
-    public void readFields(DataInput in) throws IOException {
-        this.nodeID.readFields(in);
-        this.countOfKmer = in.readInt();
-        this.incomingList.readFields(in);
-        this.outgoingList.readFields(in);
-        this.kmer.readFields(in);
-    }
-
-    @Override
-    public void write(DataOutput out) throws IOException {
-        this.nodeID.write(out);
-        out.writeInt(this.countOfKmer);
-        this.incomingList.write(out);
-        this.outgoingList.write(out);
-        this.kmer.write(out);
-    }
-
-    @Override
-    public int compareTo(NodeReference other) {
-        return this.nodeID.compareTo(other.nodeID);
-    }
-
-    @Override
-    public int hashCode() {
-        return nodeID.hashCode();
-    }
+ 
 }
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionListReference.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionListReference.java
index d4c8f7b..7b46fa5 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionListReference.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionListReference.java
@@ -1,152 +1,7 @@
 package edu.uci.ics.genomix.hyracks.data.primitive;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Iterator;
-
-import org.apache.hadoop.io.Writable;
-
+import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.hyracks.data.std.api.IValueReference;
-import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 
-public class PositionListReference implements Writable, Iterable<PositionReference>, IValueReference {
-    private byte[] storage;
-    private int offset;
-    private int valueCount;
-    private static final byte[] EMPTY = {};
-
-    private PositionReference posIter = new PositionReference();
-
-    public PositionListReference() {
-        this.storage = EMPTY;
-        this.valueCount = 0;
-        this.offset = 0;
-    }
-
-    public PositionListReference(int count, byte[] data, int offset) {
-        setNewReference(count, data, offset);
-    }
-
-    protected void setSize(int size) {
-        if (size > getCapacity()) {
-            setCapacity((size * 3 / 2));
-        }
-    }
-
-    protected int getCapacity() {
-        return storage.length - offset;
-    }
-
-    protected void setCapacity(int new_cap) {
-        if (new_cap > getCapacity()) {
-            byte[] new_data = new byte[new_cap];
-            if (storage.length - offset > 0) {
-                System.arraycopy(storage, offset, new_data, 0, storage.length - offset);
-            }
-            storage = new_data;
-            offset = 0;
-        }
-    }
-
-    public PositionReference getPosition(int i) {
-        if (i >= valueCount) {
-            throw new ArrayIndexOutOfBoundsException("No such positions");
-        }
-        posIter.setNewReference(storage, offset + i * PositionReference.LENGTH);
-        return posIter;
-    }
-
-    @Override
-    public Iterator<PositionReference> iterator() {
-        Iterator<PositionReference> it = new Iterator<PositionReference>() {
-
-            private int currentIndex = 0;
-
-            @Override
-            public boolean hasNext() {
-                return currentIndex < valueCount;
-            }
-
-            @Override
-            public PositionReference next() {
-                return getPosition(currentIndex);
-            }
-
-            @Override
-            public void remove() {
-                // TODO Auto-generated method stub
-            }
-        };
-        return it;
-    }
-
-    public void setNewReference(int count, byte[] data, int offset) {
-        this.valueCount = count;
-        this.storage = data;
-        this.offset = offset;
-    }
-
-    public void set(PositionListReference list2) {
-        set(list2.valueCount, list2.storage, list2.offset);
-    }
-
-    public void set(int valueCount, byte[] newData, int offset) {
-        this.valueCount = valueCount;
-        setSize(valueCount * PositionReference.LENGTH);
-        if (valueCount > 0) {
-            System.arraycopy(newData, offset, storage, this.offset, valueCount * PositionReference.LENGTH);
-        }
-    }
-
-    public void reset() {
-        valueCount = 0;
-    }
-
-    public void append(PositionReference pos) {
-        setSize((1 + valueCount) * PositionReference.LENGTH);
-        System.arraycopy(pos.getByteArray(), pos.getStartOffset(), storage, offset + valueCount
-                * PositionReference.LENGTH, pos.getLength());
-        valueCount += 1;
-    }
-
-    public void append(int readID, byte posInRead) {
-        setSize((1 + valueCount) * PositionReference.LENGTH);
-        IntegerSerializerDeserializer.putInt(readID, storage, offset + valueCount * PositionReference.LENGTH);
-        storage[offset + valueCount * PositionReference.LENGTH + PositionReference.INTBYTES] = posInRead;
-        valueCount += 1;
-    }
-
-    public int getCountOfPosition() {
-        return valueCount;
-    }
-
-    @Override
-    public byte[] getByteArray() {
-        return storage;
-    }
-
-    @Override
-    public int getStartOffset() {
-        return offset;
-    }
-
-    @Override
-    public int getLength() {
-        return valueCount * PositionReference.LENGTH;
-    }
-
-    @Override
-    public void readFields(DataInput in) throws IOException {
-        this.valueCount = in.readInt();
-        setSize(valueCount * PositionReference.LENGTH);
-        in.readFully(storage, offset, valueCount * PositionReference.LENGTH);
-    }
-
-    @Override
-    public void write(DataOutput out) throws IOException {
-        out.writeInt(valueCount);
-        out.write(storage, offset, valueCount * PositionReference.LENGTH);
-    }
-
+public class PositionListReference extends PositionListWritable implements  IValueReference {
 }
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionReference.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionReference.java
index 29e894b..4c19595 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionReference.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/data/primitive/PositionReference.java
@@ -1,123 +1,7 @@
 package edu.uci.ics.genomix.hyracks.data.primitive;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import org.apache.hadoop.io.WritableComparable;
-import org.apache.hadoop.io.WritableComparator;
-
+import edu.uci.ics.genomix.type.PositionWritable;
 import edu.uci.ics.hyracks.data.std.api.IValueReference;
-import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 
-public class PositionReference implements IValueReference, WritableComparable<PositionReference> {
-    private byte[] storage;
-    private int offset;
-    public static final int LENGTH = 5;
-    public static final int INTBYTES = 4;
-
-    public PositionReference() {
-        storage = new byte[LENGTH];
-        offset = 0;
-    }
-
-    public PositionReference(byte[] storage, int offset) {
-        setNewReference(storage, offset);
-    }
-
-    public PositionReference(int readID, byte posInRead) {
-        this();
-        set(readID, posInRead);
-    }
-
-    public void set(int readID, byte posInRead) {
-        IntegerSerializerDeserializer.putInt(readID, storage, offset);
-        storage[offset + INTBYTES] = posInRead;
-    }
-
-    public void setNewReference(byte[] storage, int offset) {
-        this.storage = storage;
-        this.offset = offset;
-    }
-
-    public int getReadID() {
-        return IntegerSerializerDeserializer.getInt(storage, offset);
-    }
-
-    public byte getPosInRead() {
-        return storage[offset + INTBYTES];
-    }
-
-    @Override
-    public byte[] getByteArray() {
-        return storage;
-    }
-
-    @Override
-    public int getStartOffset() {
-        return offset;
-    }
-
-    @Override
-    public int getLength() {
-        return LENGTH;
-    }
-
-    @Override
-    public void readFields(DataInput in) throws IOException {
-        in.readFully(storage, offset, LENGTH);
-    }
-
-    @Override
-    public void write(DataOutput out) throws IOException {
-        out.write(storage, offset, LENGTH);
-    }
-
-    @Override
-    public int hashCode() {
-        return this.getReadID();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof PositionReference))
-            return false;
-        PositionReference other = (PositionReference) o;
-        return this.getReadID() == other.getReadID() && this.getPosInRead() == other.getPosInRead();
-    }
-
-    @Override
-    public int compareTo(PositionReference other) {
-        int diff = this.getReadID() - other.getReadID();
-        if (diff == 0) {
-            return this.getPosInRead() - other.getPosInRead();
-        }
-        return diff;
-    }
-
-    @Override
-    public String toString() {
-        return "(" + Integer.toString(getReadID()) + "," + Integer.toString((int) getPosInRead()) + ")";
-    }
-
-    /** A Comparator optimized for IntWritable. */
-    public static class Comparator extends WritableComparator {
-        public Comparator() {
-            super(PositionReference.class);
-        }
-
-        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
-            int thisValue = IntegerSerializerDeserializer.getInt(b1, s1);
-            int thatValue = IntegerSerializerDeserializer.getInt(b2, s2);
-            int diff = thisValue - thatValue;
-            if (diff == 0){
-                return b1[s1+INTBYTES] - b2[s2+INTBYTES];
-            }
-            return diff;
-        }
-    }
-
-    static { // register this comparator
-        WritableComparator.define(PositionReference.class, new Comparator());
-    }
+public class PositionReference extends PositionWritable implements IValueReference {
 }
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/dataflow/MapReadToNodeOperator.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/dataflow/MapReadToNodeOperator.java
index 9d0a3c7..46a92ec 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/dataflow/MapReadToNodeOperator.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/dataflow/MapReadToNodeOperator.java
@@ -4,9 +4,9 @@
 import java.nio.ByteBuffer;
 
 import edu.uci.ics.genomix.hyracks.data.primitive.NodeReference;
-import edu.uci.ics.genomix.hyracks.data.primitive.PositionListReference;
 import edu.uci.ics.genomix.hyracks.data.primitive.PositionReference;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.PositionListWritable;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
 import edu.uci.ics.hyracks.api.dataflow.value.IRecordDescriptorProvider;
@@ -172,11 +172,11 @@
             }
         }
 
-        private void setPositionList(PositionListReference list, int count, byte[] array, int offset, boolean byRef) {
+        private void setPositionList(PositionListWritable positionListWritable, int count, byte[] array, int offset, boolean byRef) {
             if (byRef) {
-                list.setNewReference(count, array, offset);
+                positionListWritable.setNewReference(count, array, offset);
             } else {
-                list.set(count, array, offset);
+                positionListWritable.set(count, array, offset);
             }
         }
 
