diff --git a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ConnectedComponentsVertex.java b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ConnectedComponentsVertex.java
index 7c2d8c8..30e88ea 100644
--- a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ConnectedComponentsVertex.java
+++ b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ConnectedComponentsVertex.java
@@ -85,7 +85,7 @@
     }
 
     private VLongWritable outputValue = new VLongWritable();
-    private VLongWritable vertexValue = new VLongWritable();
+    private VLongWritable tmpVertexValue = new VLongWritable();
     private long minID;
 
     @Override
@@ -100,8 +100,8 @@
                     minID = neighbor;
                 }
             }
-            vertexValue.set(minID);
-            setVertexValue(vertexValue);
+            tmpVertexValue.set(minID);
+            setVertexValue(tmpVertexValue);
             sendOutMsgs();
         } else {
             minID = getVertexId().get();
@@ -109,8 +109,8 @@
                 minID = Math.min(minID, msgIterator.next().get());
             }
             if (minID < getVertexValue().get()) {
-                vertexValue.set(minID);
-                setVertexValue(vertexValue);
+                tmpVertexValue.set(minID);
+                setVertexValue(tmpVertexValue);
                 sendOutMsgs();
             }
         }
diff --git a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/PageRankVertex.java b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/PageRankVertex.java
index 3593a04..290f90e 100644
--- a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/PageRankVertex.java
+++ b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/PageRankVertex.java
@@ -53,7 +53,7 @@
 
     public static final String ITERATIONS = "HyracksPageRankVertex.iteration";
     private DoubleWritable outputValue = new DoubleWritable();
-    private DoubleWritable vertexValue = new DoubleWritable();
+    private DoubleWritable tmpVertexValue = new DoubleWritable();
 
     /**
      * Test whether combiner is called by summing up the messages.
@@ -99,16 +99,16 @@
     public void compute(Iterator<DoubleWritable> msgIterator) {
         int maxIteration = this.getContext().getConfiguration().getInt(ITERATIONS, 10);
         if (getSuperstep() == 1) {
-            vertexValue.set(1.0 / getNumVertices());
-            setVertexValue(vertexValue);
+            tmpVertexValue.set(1.0 / getNumVertices());
+            setVertexValue(tmpVertexValue);
         }
         if (getSuperstep() >= 2 && getSuperstep() <= maxIteration) {
             double sum = 0;
             while (msgIterator.hasNext()) {
                 sum += msgIterator.next().get();
             }
-            vertexValue.set((0.15 / getNumVertices()) + 0.85 * sum);
-            setVertexValue(vertexValue);
+            tmpVertexValue.set((0.15 / getNumVertices()) + 0.85 * sum);
+            setVertexValue(tmpVertexValue);
         }
 
         if (getSuperstep() >= 1 && getSuperstep() < maxIteration) {
diff --git a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ReachibilityVertex.java b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ReachibilityVertex.java
index 0396beb..6cacadc 100644
--- a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ReachibilityVertex.java
+++ b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ReachibilityVertex.java
@@ -84,7 +84,7 @@
         }
     }
 
-    private ByteWritable vertexValue = new ByteWritable();
+    private ByteWritable tmpVertexValue = new ByteWritable();
 
     /** The source vertex id */
     public static final String SOURCE_ID = "ReachibilityVertex.sourceId";
@@ -118,13 +118,13 @@
         if (getSuperstep() == 1) {
             boolean isSource = isSource(getVertexId());
             if (isSource) {
-                vertexValue.set((byte) 1);
-                setVertexValue(vertexValue);
+                tmpVertexValue.set((byte) 1);
+                setVertexValue(tmpVertexValue);
             }
             boolean isDest = isDest(getVertexId());
             if (isDest) {
-                vertexValue.set((byte) 2);
-                setVertexValue(vertexValue);
+                tmpVertexValue.set((byte) 2);
+                setVertexValue(tmpVertexValue);
             }
             if (isSource && isDest) {
                 signalTerminate();
@@ -133,8 +133,8 @@
             if (isSource || isDest) {
                 sendOutMsgs();
             } else {
-                vertexValue.set((byte) 0);
-                setVertexValue(vertexValue);
+                tmpVertexValue.set((byte) 0);
+                setVertexValue(tmpVertexValue);
             }
         } else {
             while (msgIterator.hasNext()) {
@@ -145,8 +145,8 @@
                     int newState = state | msgValue;
                     boolean changed = state == newState ? false : true;
                     if (changed) {
-                        vertexValue.set((byte) newState);
-                        setVertexValue(vertexValue);
+                        tmpVertexValue.set((byte) newState);
+                        setVertexValue(tmpVertexValue);
                         if (newState < 3) {
                             sendOutMsgs();
                         } else {
@@ -173,7 +173,7 @@
 
     private void sendOutMsgs() {
         for (Edge<VLongWritable, FloatWritable> edge : getEdges()) {
-            sendMsg(edge.getDestVertexId(), vertexValue);
+            sendMsg(edge.getDestVertexId(), tmpVertexValue);
         }
     }
 
diff --git a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ShortestPathsVertex.java b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ShortestPathsVertex.java
index 0a535a6..a018f08 100644
--- a/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ShortestPathsVertex.java
+++ b/pregelix-example/src/main/java/edu/uci/ics/pregelix/example/ShortestPathsVertex.java
@@ -82,7 +82,7 @@
     }
 
     private DoubleWritable outputValue = new DoubleWritable();
-    private DoubleWritable vertexValue = new DoubleWritable();
+    private DoubleWritable tmpVertexValue = new DoubleWritable();
     /** Class logger */
     private static final Logger LOG = Logger.getLogger(ShortestPathsVertex.class.getName());
     /** The shortest paths id */
@@ -102,8 +102,8 @@
     @Override
     public void compute(Iterator<DoubleWritable> msgIterator) {
         if (getSuperstep() == 1) {
-            vertexValue.set(Double.MAX_VALUE);
-            setVertexValue(vertexValue);
+            tmpVertexValue.set(Double.MAX_VALUE);
+            setVertexValue(tmpVertexValue);
         }
         double minDist = isSource() ? 0d : Double.MAX_VALUE;
         while (msgIterator.hasNext()) {
@@ -113,8 +113,8 @@
             LOG.fine("Vertex " + getVertexId() + " got minDist = " + minDist + " vertex value = " + getVertexValue());
         }
         if (minDist < getVertexValue().get()) {
-            vertexValue.set(minDist);
-            setVertexValue(vertexValue);
+            tmpVertexValue.set(minDist);
+            setVertexValue(tmpVertexValue);
             for (Edge<VLongWritable, FloatWritable> edge : getEdges()) {
                 if (LOG.getLevel() == Level.FINE) {
                     LOG.fine("Vertex " + getVertexId() + " sent to " + edge.getDestVertexId() + " = "
