diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/KmerVertexID.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/KmerVertexID.java
deleted file mode 100644
index 9a01e36..0000000
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/KmerVertexID.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2009-2012 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package edu.uci.ics.genomix.experiment;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import org.apache.hadoop.io.Writable;
-
-public class KmerVertexID implements Writable {
-    private int readID;
-    private byte posInRead;
-
-    public KmerVertexID(int readID, byte posInRead) {
-        set(readID, posInRead);
-    }
-
-    public KmerVertexID() {
-        readID = -1;
-        posInRead = -1;
-    }
-
-    @Override
-    public void readFields(DataInput arg0) throws IOException {
-        readID = arg0.readInt();
-        posInRead = arg0.readByte();
-    }
-
-    @Override
-    public void write(DataOutput arg0) throws IOException {
-        arg0.writeInt(readID);
-        arg0.writeByte(posInRead);
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(readID) + '\t' + String.valueOf(posInRead);
-    }
-
-    public void set(int readID, byte posInRead) {
-        this.readID = readID;
-        this.posInRead = posInRead;
-    }
-
-    public int getReadID() {
-        return readID;
-    }
-
-    public void setReadID(int readID) {
-        this.readID = readID;
-    }
-
-    public byte getPosInRead() {
-        return posInRead;
-    }
-}
\ No newline at end of file
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexAdjacentWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexAdjacentWritable.java
index 191aacf..4145a3b 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexAdjacentWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexAdjacentWritable.java
@@ -19,7 +19,7 @@
         this(null, 0, EMPTY_BYTES);
     }
 
-    public VertexAdjacentWritable(VertexIDList right, int kmerSize, byte[] bytes) {
+    public VertexAdjacentWritable(PositionList right, int kmerSize, byte[] bytes) {
         if (right != null)
             this.adjVertexList = new VertexIDListWritable(right);
         else
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDList.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDList.java
deleted file mode 100644
index f799b00..0000000
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDList.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package edu.uci.ics.genomix.experiment;
-
-public class VertexIDList {
-
-    private int[] readIDList;
-    private byte[] posInReadList;
-    private static final int[] EMPTY_INTS = {};
-    private static final byte[] EMPTY_BYTES = {};
-
-    private int usedSize;
-    private int arraySize;
-
-    public VertexIDList() {
-        this(0, 0, EMPTY_INTS, EMPTY_BYTES);
-    }
-
-    public VertexIDList(int usedSize, int arraySize, int[] rList, byte[] pList) {
-        this.usedSize = usedSize;
-        this.arraySize = arraySize;
-        if (arraySize > 0) {
-            this.readIDList = rList;
-            this.posInReadList = pList;
-            if (this.readIDList.length != arraySize | this.posInReadList.length != arraySize) {
-                throw new ArrayIndexOutOfBoundsException("the arraySize doesn't corespond to the array");
-            }
-            if (this.readIDList.length < usedSize | this.posInReadList.length < usedSize) {
-                throw new ArrayIndexOutOfBoundsException("the usedSize doesn't corespond to the array");
-            }
-        } else {
-            this.readIDList = rList;
-            this.posInReadList = pList;
-            this.arraySize = 0;
-            this.usedSize = 0;
-        }
-    }
-
-    public VertexIDList(int arraySize) {
-        this.arraySize = arraySize;
-        this.usedSize = 0;
-        if (arraySize > 0) {
-            this.readIDList = new int[this.arraySize];
-            this.posInReadList = new byte[this.arraySize];
-        } else {
-            this.readIDList = EMPTY_INTS;
-            this.posInReadList = EMPTY_BYTES;
-        }
-    }
-
-    public VertexIDList(VertexIDList right) {
-        if (right != null) {
-            this.usedSize = right.usedSize;
-            this.arraySize = right.arraySize;
-            this.readIDList = new int[right.arraySize];
-            this.posInReadList = new byte[right.arraySize];
-            if (this.readIDList.length != arraySize | this.posInReadList.length != arraySize) {
-                throw new ArrayIndexOutOfBoundsException("the arraySize doesn't corespond to the array");
-            }
-            if (this.readIDList.length < usedSize | this.posInReadList.length < usedSize) {
-                throw new ArrayIndexOutOfBoundsException("the usedSize doesn't corespond to the array");
-            }
-            set(right);
-        } else {
-            this.arraySize = 0;
-            this.usedSize = 0;
-            this.readIDList = EMPTY_INTS;
-            this.posInReadList = EMPTY_BYTES;
-        }
-    }
-
-    public void set(VertexIDList newData) {
-        set(newData.readIDList, 0, newData.posInReadList, 0, newData.usedSize);
-    }
-
-    public void set(int[] rIDList, int rOffset, byte[] pReadList, int pOffset, int copySize) {
-        setArraySize(0);
-        setArraySize(copySize);
-        System.arraycopy(rIDList, rOffset, this.readIDList, 0, copySize);
-        System.arraycopy(pReadList, pOffset, this.posInReadList, 0, copySize);
-        this.usedSize = copySize;
-    }
-
-    public void setArraySize(int arraySize) {
-        if (arraySize > getCapacity()) {
-            setCapacity((arraySize * 2));
-        }
-        this.arraySize = arraySize;
-    }
-
-    public int getCapacity() {
-        return this.arraySize;
-    }
-
-    public void setCapacity(int new_cap) {
-        if (new_cap != getCapacity()) {
-            int[] newRList = new int[new_cap];
-            byte[] newPList = new byte[new_cap];
-            if (new_cap < this.arraySize) {
-                this.arraySize = new_cap;
-            }
-            if (this.arraySize != 0) {
-                System.arraycopy(this.readIDList, 0, newRList, 0, this.usedSize);
-                System.arraycopy(this.posInReadList, 0, newPList, 0, this.usedSize);
-            }
-            this.readIDList = newRList;
-            this.posInReadList = newPList;
-        }
-    }
-
-    public int getReadListElement(int position) {
-        if (position < this.usedSize) {
-            return this.readIDList[position];
-        } else {
-            throw new ArrayIndexOutOfBoundsException("position exceed for the usedSize");
-        }
-    }
-
-    public byte getPosinReadListElement(int position) {
-        if (position < this.usedSize) {
-            return this.posInReadList[position];
-        } else {
-            throw new ArrayIndexOutOfBoundsException("position exceed for the usedSize");
-        }
-    }
-
-    public int findReadListElement(int rContent) {
-        for (int i = 0; i < this.usedSize; i++) {
-            if (this.readIDList[i] == rContent)
-                return i;
-        }
-        return -1;
-    }
-
-    public int findPosinReadListElement(int pContent) {
-        for (int i = 0; i < this.usedSize; i++) {
-            if (this.usedSize == pContent)
-                return i;
-        }
-        return -1;
-    }
-
-    public void addELementToList(int rContent, byte pContent) {
-        if (this.usedSize < this.arraySize) {
-            this.readIDList[this.usedSize] = rContent;
-            this.posInReadList[this.usedSize] = pContent;
-            this.usedSize++;
-        } else {
-            setCapacity((this.arraySize * 2));
-            this.readIDList[this.usedSize] = rContent;
-            this.posInReadList[this.usedSize] = pContent;
-            this.usedSize++;
-        }
-    }
-
-    public void deleteElementFromTwoList(int position) {
-        if (position < this.usedSize) {
-            for (int i = position; i < this.usedSize; i++) {
-                this.readIDList[i] = this.readIDList[i + 1];
-                this.posInReadList[i] = this.posInReadList[i + 1];
-            }
-            this.readIDList[this.usedSize - 1] = -1;
-            this.posInReadList[this.usedSize - 1] = (byte) -1;
-            this.usedSize--;
-        } else {
-            throw new ArrayIndexOutOfBoundsException("position exceed for the usedSize");
-        }
-    }
-    
-    public int[] getReadIDList() {
-        return this.readIDList;
-    }
-    
-    public byte[] getPosInReadList() {
-        return this.posInReadList;
-    }
-    
-    public int getUsedSize() {
-        return this.usedSize;
-    }
-    
-    public int getArraySize() {
-        return this.arraySize;
-    }
-}
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDListWritable.java
index f7d917a..d8763e9 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/experiment/VertexIDListWritable.java
@@ -7,26 +7,26 @@
 
 public class VertexIDListWritable implements Writable {
 
-    private VertexIDList vertexIDList;
+    private PositionList vertexIDList;
     private int[] tempReadIDList = null;
     private byte[] tempPosInReadList = null;
     
     public VertexIDListWritable() {
-        this.vertexIDList = new VertexIDList();
+        this.vertexIDList = new PositionList();
     }
     
-    public VertexIDListWritable(VertexIDList right) {
-        this.vertexIDList = new VertexIDList(right);
+    public VertexIDListWritable(PositionList right) {
+        this.vertexIDList = new PositionList(right);
     }
 
     public VertexIDListWritable(int length) {
-        this.vertexIDList = new VertexIDList(length);
+        this.vertexIDList = new PositionList(length);
     }
     
     public void set(VertexIDListWritable right) {
         set(right.get());
     }
-    public void set(VertexIDList right) {
+    public void set(PositionList right) {
         this.vertexIDList.set(right);
     }
 
@@ -46,8 +46,13 @@
         }
     }
 
+//    Position [] pos  = new Position();
     @Override
     public void write(DataOutput out) throws IOException {
+//        out.writeInt(length);
+//        for ( int i: length){
+//            pos[i].write(out);
+//        }
         // TODO Auto-generated method stub
         out.writeInt(vertexIDList.getArraySize());
         out.writeInt(vertexIDList.getUsedSize());
@@ -60,7 +65,7 @@
         }
     }
     
-    public VertexIDList get() {
+    public PositionList get() {
         return vertexIDList;
     }
 }
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/MergePathValueWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/MergePathValueWritable.java
deleted file mode 100644
index 4e8199a..0000000
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/MergePathValueWritable.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2009-2012 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package edu.uci.ics.genomix.type;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import org.apache.hadoop.io.BinaryComparable;
-import org.apache.hadoop.io.WritableComparable;
-
-import edu.uci.ics.genomix.type.GeneCode;
-import edu.uci.ics.genomix.type.VKmerBytesWritable;
-
-public class MergePathValueWritable extends BinaryComparable implements WritableComparable<BinaryComparable> {
-
-    private static final byte[] EMPTY_BYTES = {};
-    private byte adjBitMap;
-    private byte flag;
-    private VKmerBytesWritable kmer;
-
-    public MergePathValueWritable() {
-        this((byte) 0, (byte) 0, 0, EMPTY_BYTES);
-    }
-    
-    public MergePathValueWritable(int k) {
-        this.adjBitMap = 0;
-        this.flag = 0;
-        this.kmer = new VKmerBytesWritable(k);
-    }
-    
-    public MergePathValueWritable(byte adjBitMap, byte flag, int kmerSize, byte[] bytes) {
-        this.adjBitMap = adjBitMap;
-        this.flag = flag;
-        this.kmer = new VKmerBytesWritable(kmerSize, bytes);
-        kmer.set(bytes, 0, bytes.length);
-    }
-
-    public void set(MergePathValueWritable right) {
-        set(right.getAdjBitMap(), right.getFlag(), right.getKmer());
-    }
-
-    public void set(byte adjBitMap, byte flag, VKmerBytesWritable kmer) {
-        this.kmer.set(kmer);
-        this.adjBitMap = adjBitMap;
-        this.flag = flag;
-    }
-
-    @Override
-    public void readFields(DataInput arg0) throws IOException {
-        // TODO Auto-generated method stub
-        kmer.readFields(arg0);
-        adjBitMap = arg0.readByte();
-        flag = arg0.readByte();
-    }
-
-    @Override
-    public void write(DataOutput arg0) throws IOException {
-        // TODO Auto-generated method stub
-
-        kmer.write(arg0);
-        arg0.writeByte(adjBitMap);
-        arg0.writeByte(flag);
-    }
-
-    public VKmerBytesWritable getKmer() {
-        if (kmer.getLength() != 0) {
-            return kmer;
-        }
-        return null;
-    }
-
-    public byte getAdjBitMap() {
-        return this.adjBitMap;
-    }
-
-    public byte getFlag() {
-        return this.flag;
-    }
-
-    public String toString() {
-        return GeneCode.getSymbolFromBitMap(adjBitMap) + '\t' + String.valueOf(flag);
-    }
-
-    public String pureToString() {
-        return GeneCode.getSymbolFromBitMap(adjBitMap);
-    }
-    @Override
-    public byte[] getBytes() {
-        // TODO Auto-generated method stub
-        if (kmer.getLength() != 0) {
-            return kmer.getBytes();
-        } else
-            return null;
-
-    }
-
-    public int getKmerLength() {
-        return kmer.getKmerLength();
-    }
-
-    @Override
-    public int getLength() {
-        return kmer.getLength();
-    }
-}
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingMapper.java
index d2aa96e..254d891 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingMapper.java
@@ -6,7 +6,7 @@
 import org.apache.hadoop.mapred.Mapper;
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reporter;
-import edu.uci.ics.genomix.experiment.VertexIDList;
+import edu.uci.ics.genomix.experiment.PositionList;
 import edu.uci.ics.genomix.experiment.VertexIDListWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 
@@ -14,7 +14,7 @@
 public class DeepGraphBuildingMapper extends MapReduceBase implements
         Mapper<KmerBytesWritable, VertexIDListWritable, IntWritable, LineBasedmappingWritable> {
     IntWritable  numLine = new IntWritable();
-    VertexIDList vertexList = new VertexIDList(1);
+    PositionList vertexList = new PositionList(1);
     LineBasedmappingWritable lineBasedWriter = new LineBasedmappingWritable();
     @Override
     public void map(KmerBytesWritable key, VertexIDListWritable value, OutputCollector<IntWritable, LineBasedmappingWritable> output,
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingReducer.java
index 0a3270e..cace3d2 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/DeepGraphBuildingReducer.java
@@ -9,9 +9,9 @@
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reducer;
 import org.apache.hadoop.mapred.Reporter;
-import edu.uci.ics.genomix.experiment.KmerVertexID;
+import edu.uci.ics.genomix.experiment.Position;
 import edu.uci.ics.genomix.experiment.VertexAdjacentWritable;
-import edu.uci.ics.genomix.experiment.VertexIDList;
+import edu.uci.ics.genomix.experiment.PositionList;
 import edu.uci.ics.genomix.experiment.VertexIDListWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
@@ -19,20 +19,20 @@
 
 @SuppressWarnings("deprecation")
 public class DeepGraphBuildingReducer extends MapReduceBase implements
-        Reducer<IntWritable, LineBasedmappingWritable, KmerVertexID, VertexAdjacentWritable> {
+        Reducer<IntWritable, LineBasedmappingWritable, Position, VertexAdjacentWritable> {
 
     public ArrayList<LineBasedmappingWritable> lineElementsSet = new ArrayList<LineBasedmappingWritable>();
-    public KmerVertexID outputVerID = new KmerVertexID();
+    public Position outputVerID = new Position();
     public VertexAdjacentWritable outputAdjacentList = new VertexAdjacentWritable();
-    public VertexIDList srcVtexAdjList = new VertexIDList();
-    public VertexIDList desVtexAdjList = new VertexIDList();
+    public PositionList srcVtexAdjList = new PositionList();
+    public PositionList desVtexAdjList = new PositionList();
     public VertexIDListWritable srcAdjListWritable = new VertexIDListWritable();
     public VKmerBytesWritable desKmer = new VKmerBytesWritable(1);
     public VKmerBytesWritableFactory kmerFactory = new VKmerBytesWritableFactory(1);
     public VKmerBytesWritable srcKmer = new VKmerBytesWritable(1);
     @Override
     public void reduce(IntWritable key, Iterator<LineBasedmappingWritable> values,
-            OutputCollector<KmerVertexID, VertexAdjacentWritable> output, Reporter reporter) throws IOException {
+            OutputCollector<Position, VertexAdjacentWritable> output, Reporter reporter) throws IOException {
         while (values.hasNext()) {
             lineElementsSet.add(values.next());
         }
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexMapper.java
index fe63012..9b5fec2 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexMapper.java
@@ -10,26 +10,26 @@
 import org.apache.hadoop.mapred.Mapper;
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reporter;
-import edu.uci.ics.genomix.experiment.KmerVertexID;
+import edu.uci.ics.genomix.experiment.Position;
 import edu.uci.ics.genomix.type.GeneCode;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.KmerCountValue;
 
 public class GraphKmerInvertedIndexMapper extends MapReduceBase implements
-        Mapper<LongWritable, Text, KmerBytesWritable, KmerVertexID> {
+        Mapper<LongWritable, Text, KmerBytesWritable, Position> {
     
     public static int KMER_SIZE;
-    public KmerVertexID outputVertexID;
+    public Position outputVertexID;
     public KmerBytesWritable outputKmer;
 
     @Override
     public void configure(JobConf job) {
         KMER_SIZE = Integer.parseInt(job.get("sizeKmer"));
-        outputVertexID = new KmerVertexID();
+        outputVertexID = new Position();
         outputKmer = new KmerBytesWritable(KMER_SIZE);
     }
     @Override
-    public void map(LongWritable key, Text value, OutputCollector<KmerBytesWritable, KmerVertexID> output,
+    public void map(LongWritable key, Text value, OutputCollector<KmerBytesWritable, Position> output,
             Reporter reporter) throws IOException {
         
         String geneLine = value.toString();
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexReducer.java
index a228a3c..a4a579b 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/GraphKmerInvertedIndexReducer.java
@@ -7,22 +7,22 @@
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reducer;
 import org.apache.hadoop.mapred.Reporter;
-import edu.uci.ics.genomix.experiment.KmerVertexID;
-import edu.uci.ics.genomix.experiment.VertexIDList;
+import edu.uci.ics.genomix.experiment.Position;
+import edu.uci.ics.genomix.experiment.PositionList;
 import edu.uci.ics.genomix.experiment.VertexIDListWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 
 @SuppressWarnings({ "deprecation", "unused" })
 public class GraphKmerInvertedIndexReducer extends MapReduceBase implements
-        Reducer<KmerBytesWritable, KmerVertexID, KmerBytesWritable, VertexIDListWritable> {
-    VertexIDList vertexList = new VertexIDList(1);
+        Reducer<KmerBytesWritable, Position, KmerBytesWritable, VertexIDListWritable> {
+    PositionList vertexList = new PositionList(1);
     VertexIDListWritable listWritable = new VertexIDListWritable();
     @Override
-    public void reduce(KmerBytesWritable key, Iterator<KmerVertexID> values,
+    public void reduce(KmerBytesWritable key, Iterator<Position> values,
             OutputCollector<KmerBytesWritable, VertexIDListWritable> output, Reporter reporter) throws IOException {
         while (values.hasNext()) {
-            KmerVertexID vertexID = values.next();
+            Position vertexID = values.next();
             vertexList.addELementToList(vertexID.getReadID(), vertexID.getPosInRead());
         }
         listWritable.set(vertexList);
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/LineBasedmappingWritable.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/LineBasedmappingWritable.java
index 658d56d..aa9413c 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/LineBasedmappingWritable.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/experiments/LineBasedmappingWritable.java
@@ -5,7 +5,7 @@
 import java.io.IOException;
 
 import edu.uci.ics.genomix.experiment.VertexAdjacentWritable;
-import edu.uci.ics.genomix.experiment.VertexIDList;
+import edu.uci.ics.genomix.experiment.PositionList;
 import edu.uci.ics.genomix.experiment.VertexIDListWritable;
 import edu.uci.ics.genomix.type.KmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
@@ -18,7 +18,7 @@
         this.posInInvertedIndex = -1;        
     }
 
-    public LineBasedmappingWritable(int posInInvertedIndex, VertexIDList right, int kmerSize, byte[] bytes) {       
+    public LineBasedmappingWritable(int posInInvertedIndex, PositionList right, int kmerSize, byte[] bytes) {       
         super(right, kmerSize, bytes);
         this.posInInvertedIndex = posInInvertedIndex;
     }
