diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/GeneCode.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/GeneCode.java
index be65d55..6a5ad7b 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/GeneCode.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/GeneCode.java
@@ -15,7 +15,6 @@
 
 package edu.uci.ics.genomix.type;
 
-import javax.management.RuntimeErrorException;
 
 public class GeneCode {
     public final static byte[] GENE_SYMBOL = { 'A', 'C', 'G', 'T' };
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java
index 4684a06..3f59e32 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/IntermediateNodeWritable.java
@@ -16,34 +16,34 @@
     private KmerListWritable forwardReverseList;
     private KmerListWritable reverseForwardList;
     private KmerListWritable reverseReverseList;
-    private long uuid;
+    private PositionWritable uniqueKey;
     
     public IntermediateNodeWritable(){
         forwardForwardList = new KmerListWritable();
         forwardReverseList = new KmerListWritable();
         reverseForwardList = new KmerListWritable();
         reverseReverseList = new KmerListWritable();
-        uuid = 0L;
+        uniqueKey = new PositionWritable();
     }
     
     public IntermediateNodeWritable(KmerListWritable FFList, KmerListWritable FRList,
-            KmerListWritable RFList, KmerListWritable RRList, long uuid) {
+            KmerListWritable RFList, KmerListWritable RRList, PositionWritable uniqueKey) {
         this();
-        set(FFList, FRList, RFList, RRList, uuid);
+        set(FFList, FRList, RFList, RRList, uniqueKey);
     }
     
     public void set(IntermediateNodeWritable node){
         set(node.forwardForwardList, node.forwardReverseList, node.reverseForwardList, 
-                node.reverseReverseList, node.uuid);
+                node.reverseReverseList, node.uniqueKey);
     }
     
     public void set(KmerListWritable FFList, KmerListWritable FRList,
-            KmerListWritable RFList, KmerListWritable RRList, long uuid) {
+            KmerListWritable RFList, KmerListWritable RRList, PositionWritable uniqueKey) {
         this.forwardForwardList.set(FFList);
         this.forwardReverseList.set(FRList);
         this.reverseForwardList.set(RFList);
         this.reverseReverseList.set(RRList);
-        this.uuid = uuid;
+        this.uniqueKey.set(uniqueKey);
     }
 
     public void reset(int kmerSize) {
@@ -51,7 +51,7 @@
         forwardReverseList.reset();
         reverseForwardList.reset();
         reverseReverseList.reset();
-        uuid = 0;
+        uniqueKey.reset();
     }
     
     public KmerListWritable getFFList() {
@@ -59,15 +59,15 @@
     }
 
     public void setFFList(KmerListWritable forwardForwardList) {
-        this.forwardForwardList = forwardForwardList;
+        this.forwardForwardList.set(forwardForwardList);
     }
 
-    public KmerListWritable getFReList() {
+    public KmerListWritable getFRList() {
         return forwardReverseList;
     }
 
     public void setFRList(KmerListWritable forwardReverseList) {
-        this.forwardReverseList = forwardReverseList;
+        this.forwardReverseList.set(forwardReverseList);
     }
 
     public KmerListWritable getRFList() {
@@ -75,7 +75,7 @@
     }
 
     public void setRFList(KmerListWritable reverseForwardList) {
-        this.reverseForwardList = reverseForwardList;
+        this.reverseForwardList.set(reverseForwardList);
     }
 
     public KmerListWritable getRRList() {
@@ -83,16 +83,24 @@
     }
 
     public void setRRList(KmerListWritable reverseReverseList) {
-        this.reverseReverseList = reverseReverseList;
+        this.reverseReverseList.set(reverseReverseList);
     }
 
-    @Override
+    public PositionWritable getUniqueKey() {
+		return uniqueKey;
+	}
+
+	public void setUniqueKey(PositionWritable uniqueKey) {
+		this.uniqueKey.set(uniqueKey);
+	}
+
+	@Override
     public void readFields(DataInput in) throws IOException {
         this.forwardForwardList.readFields(in);
         this.forwardReverseList.readFields(in);
         this.reverseForwardList.readFields(in);
         this.reverseReverseList.readFields(in);
-        this.uuid = in.readLong();
+        this.uniqueKey.readFields(in);
     }
 
     @Override
@@ -101,18 +109,18 @@
         this.forwardReverseList.write(out);
         this.reverseForwardList.write(out);
         this.reverseReverseList.write(out);
-        out.writeLong(this.uuid);
+        this.uniqueKey.write(out);
     }
 
     @Override
     public int compareTo(IntermediateNodeWritable other) {
         // TODO Auto-generated method stub
-        return this.uuid > other.uuid ? 1 : ((this.uuid == other.uuid) ? 0 : -1);
+        return this.uniqueKey.compareTo(other.uniqueKey);
     }
     
     @Override
     public int hashCode() {
-        return Long.valueOf(this.uuid).hashCode(); 
+        return this.uniqueKey.hashCode();
     }
     
     @Override
@@ -122,7 +130,7 @@
             return (this.forwardForwardList.equals(nw.forwardForwardList)
                     && this.forwardReverseList.equals(nw.forwardReverseList)
                     && this.reverseForwardList.equals(nw.reverseForwardList)
-                    && this.reverseReverseList.equals(nw.reverseReverseList) && (this.uuid == nw.uuid));
+                    && this.reverseReverseList.equals(nw.reverseReverseList) && (this.uniqueKey.equals(nw.uniqueKey)));
         }
         return false;
     }
@@ -135,7 +143,7 @@
         sbuilder.append(forwardReverseList.toString()).append('\t');
         sbuilder.append(reverseForwardList.toString()).append('\t');
         sbuilder.append(reverseReverseList.toString()).append('\t');
-        sbuilder.append(uuid).append(')');
+        sbuilder.append(uniqueKey.toString()).append(')');
         return sbuilder.toString();
     }
 }
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
index 4240b1d..6c9dfe4 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerListWritable.java
@@ -131,14 +131,14 @@
     @Override
     public void readFields(DataInput in) throws IOException {
         this.valueCount = in.readInt();
-        setSize(valueCount * PositionWritable.LENGTH);
-        in.readFully(storage, offset, valueCount * PositionWritable.LENGTH);
+        setSize(valueCount * KMER_LENGTH);
+        in.readFully(storage, offset, valueCount * KMER_LENGTH);
     }
 
     @Override
     public void write(DataOutput out) throws IOException {
         out.writeInt(valueCount);
-        out.write(storage, offset, valueCount * PositionWritable.LENGTH);
+        out.write(storage, offset, valueCount * KMER_LENGTH);
     }
     
     public int getCountOfPosition() {
@@ -152,4 +152,8 @@
     public int getStartOffset() {
         return offset;
     }
+    
+    public int getLength() {
+        return valueCount * KMER_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 06d7d9c..1079677 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
@@ -57,6 +57,11 @@
         this.offset = offset;
     }
     
+    public void reset(){
+        storage = new byte[LENGTH];
+        offset = 0;
+    }
+    
     public long getUUID(){
         return Marshal.getLong(storage, offset);
     }
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
index 2b7dd81..97bb54a 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
@@ -24,11 +24,10 @@
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.Text;
 
-import edu.uci.ics.genomix.hyracks.data.primitive.PositionReference;
-import edu.uci.ics.genomix.type.GeneCode;
 import edu.uci.ics.genomix.type.IntermediateNodeWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.KmerListWritable;
+import edu.uci.ics.genomix.type.PositionWritable;
 import edu.uci.ics.hyracks.api.comm.IFrameWriter;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -48,7 +47,6 @@
     public static final int OutputPosition = 1;
     public static final int OutputKmerListField = 2;
 
-    private final boolean bReversed;
     private final int readLength;
     private final int kmerSize;
 
@@ -56,7 +54,6 @@
             null });
 
     public ReadsKeyValueParserFactory(int readlength, int k, boolean bGenerateReversed) {
-        bReversed = bGenerateReversed;
         this.readLength = readlength;
         this.kmerSize = k;
     }
@@ -72,9 +69,10 @@
 
             private KmerBytesWritable kmer = new KmerBytesWritable(kmerSize);
             private KmerBytesWritable nextKmer = new KmerBytesWritable(kmerSize);
-            private PositionReference pos = new PositionReference();
+            private PositionWritable uniqueKey = new PositionWritable();
             private KmerListWritable kmerList = new KmerListWritable();
             private IntermediateNodeWritable interMediateNode = new IntermediateNodeWritable();
+            private byte mateId = 0;
             
             @Override
             public void parse(LongWritable key, Text value, IFrameWriter writer) throws HyracksDataException {
@@ -111,37 +109,37 @@
                 nextKmer.set(kmer);
                 nextKmer.shiftKmerWithNextChar(array[kmerSize]);
                 kmerList.append(nextKmer);
+                uniqueKey.set(mateId, readID, 1);
+                interMediateNode.setUniqueKey(uniqueKey);
                 interMediateNode.setFFList(kmerList);
-                InsertToFrame(kmer, readID, 1, writer);
+                InsertToFrame(kmer, interMediateNode, writer);
 
                 /** middle kmer */
                 for (int i = kmerSize; i < array.length; i++) {
                     kmer.shiftKmerWithNextChar(array[i]);
-                    InsertToFrame(kmer, readID, i - kmerSize + 2, writer);
-                }
-
-                if (bReversed) {
-                    /** first kmer */
-                    kmer.setByReadReverse(array, 0);
-                    InsertToFrame(kmer, readID, -1, writer);
-                    /** middle kmer */
-                    for (int i = kmerSize; i < array.length; i++) {
-                        kmer.shiftKmerWithPreCode(GeneCode.getPairedCodeFromSymbol(array[i]));
-                        InsertToFrame(kmer, readID, -(i - kmerSize + 2), writer);
-                    }
+                    nextKmer.set(kmer);
+                    nextKmer.shiftKmerWithNextChar(array[i+1]);
+                    kmerList.append(nextKmer);
+                    uniqueKey.set(mateId, readID, i - kmerSize + 2);
+                    interMediateNode.setUniqueKey(uniqueKey);
+                    interMediateNode.setFFList(kmerList);
+                    InsertToFrame(kmer, interMediateNode, writer);
                 }
             }
 
-            private void InsertToFrame(KmerBytesWritable kmer, int readID, int posInRead, IFrameWriter writer) {
+            private void InsertToFrame(KmerBytesWritable kmer, IntermediateNodeWritable node, IFrameWriter writer) {
                 try {
-                    if (Math.abs(posInRead) > 127) {
-                        throw new IllegalArgumentException("Position id is beyond 127 at " + readID);
+                    if (Math.abs(node.getUniqueKey().getPosId()) > 32768) {
+                        throw new IllegalArgumentException("Position id is beyond 32768 at " + node.getUniqueKey().getReadId());
                     }
                     tupleBuilder.reset();
                     tupleBuilder.addField(kmer.getBytes(), kmer.getOffset(), kmer.getLength());
-                    pos.set(readID, (byte) posInRead);
-                    tupleBuilder.addField(pos.getByteArray(), pos.getStartOffset(), pos.getLength());
-
+                    tupleBuilder.addField(node.getFFList().getByteArray(), node.getFFList().getStartOffset(), node.getFFList().getLength());
+                    tupleBuilder.addField(node.getFRList().getByteArray(), node.getFRList().getStartOffset(), node.getFRList().getLength());
+                    tupleBuilder.addField(node.getRFList().getByteArray(), node.getRFList().getStartOffset(), node.getRFList().getLength());
+                    tupleBuilder.addField(node.getRRList().getByteArray(), node.getRRList().getStartOffset(), node.getRRList().getLength());
+                    tupleBuilder.addField(node.getUniqueKey().getByteArray(), node.getUniqueKey().getStartOffset(), node.getUniqueKey().getLength());
+                    
                     if (!outputAppender.append(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray(), 0,
                             tupleBuilder.getSize())) {
                         FrameUtils.flushFrame(outputBuffer, writer);
