diff --git a/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/PJobContext.java b/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/PJobContext.java
index 0ddb7d5..ceb085c 100644
--- a/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/PJobContext.java
+++ b/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/PJobContext.java
@@ -18,8 +18,8 @@
 
     private final Map<Long, List<FileReference>> iterationToFiles = new ConcurrentHashMap<Long, List<FileReference>>();
     private final Map<TaskIterationID, IStateObject> appStateMap = new ConcurrentHashMap<TaskIterationID, IStateObject>();
-    private final Map<String, Long> jobIdToSuperStep = new ConcurrentHashMap<String, Long>();
-    private final Map<String, Boolean> jobIdToMove = new ConcurrentHashMap<String, Boolean>();
+    private Long jobIdToSuperStep;
+    private Boolean jobIdToMove;
 
     public void close() throws HyracksDataException {
         for (Entry<Long, List<FileReference>> entry : iterationToFiles.entrySet())
@@ -30,15 +30,13 @@
         appStateMap.clear();
     }
 
-    public void clearState(String jobId) throws HyracksDataException {
+    public void clearState() throws HyracksDataException {
         for (Entry<Long, List<FileReference>> entry : iterationToFiles.entrySet())
             for (FileReference fileRef : entry.getValue())
                 fileRef.delete();
 
         iterationToFiles.clear();
         appStateMap.clear();
-        jobIdToMove.remove(jobId);
-        jobIdToSuperStep.remove(jobId);
     }
 
     public Map<TaskIterationID, IStateObject> getAppStateStore() {
@@ -49,51 +47,49 @@
         return (RuntimeContext) ctx.getJobletContext().getApplicationContext().getApplicationObject();
     }
 
-    public void setVertexProperties(String jobId, long numVertices, long numEdges, long currentIteration, ClassLoader cl) {
-        Boolean toMove = jobIdToMove.get(jobId);
-        if (toMove == null || toMove == true) {
-            if (jobIdToSuperStep.get(jobId) == null) {
+    public void setVertexProperties(long numVertices, long numEdges, long currentIteration, ClassLoader cl) {
+        if (jobIdToMove == null || jobIdToMove == true) {
+            if (jobIdToSuperStep == null) {
                 if (currentIteration <= 0) {
-                    jobIdToSuperStep.put(jobId, 0L);
+                    jobIdToSuperStep = 0L;
                 } else {
-                    jobIdToSuperStep.put(jobId, currentIteration);
+                    jobIdToSuperStep = currentIteration;
                 }
             }
 
-            long superStep = jobIdToSuperStep.get(jobId);
+            long superStep = jobIdToSuperStep;
             List<FileReference> files = iterationToFiles.remove(superStep - 1);
             if (files != null) {
                 for (FileReference fileRef : files)
                     fileRef.delete();
             }
 
-            setProperties(jobId, numVertices, numEdges, currentIteration, superStep, false, cl);
+            setProperties(numVertices, numEdges, currentIteration, superStep, false, cl);
         }
         System.gc();
     }
 
-    public void recoverVertexProperties(String jobId, long numVertices, long numEdges, long currentIteration,
-            ClassLoader cl) {
-        if (jobIdToSuperStep.get(jobId) == null) {
+    public void recoverVertexProperties(long numVertices, long numEdges, long currentIteration, ClassLoader cl) {
+        if (jobIdToSuperStep == null) {
             if (currentIteration <= 0) {
-                jobIdToSuperStep.put(jobId, 0L);
+                jobIdToSuperStep = 0L;
             } else {
-                jobIdToSuperStep.put(jobId, currentIteration);
+                jobIdToSuperStep = currentIteration;
             }
         }
 
-        long superStep = jobIdToSuperStep.get(jobId);
+        long superStep = jobIdToSuperStep;
         List<FileReference> files = iterationToFiles.remove(superStep - 1);
         if (files != null) {
             for (FileReference fileRef : files)
                 fileRef.delete();
         }
 
-        setProperties(jobId, numVertices, numEdges, currentIteration, superStep, true, cl);
+        setProperties(numVertices, numEdges, currentIteration, superStep, true, cl);
     }
 
-    public void endSuperStep(String pregelixJobId) {
-        jobIdToMove.put(pregelixJobId, true);
+    public void endSuperStep() {
+        jobIdToMove = true;
         LOGGER.info("end iteration " + Vertex.getSuperstep());
     }
 
@@ -101,8 +97,8 @@
         return iterationToFiles;
     }
 
-    private void setProperties(String jobId, long numVertices, long numEdges, long currentIteration, long superStep,
-            boolean toMove, ClassLoader cl) {
+    private void setProperties(long numVertices, long numEdges, long currentIteration, long superStep, boolean toMove,
+            ClassLoader cl) {
         try {
             Class<?> vClass = (Class<?>) cl.loadClass("edu.uci.ics.pregelix.api.graph.Vertex");
             Method superStepMethod = vClass.getMethod("setSuperstep", Long.TYPE);
@@ -120,8 +116,8 @@
             numVerticesMethod.invoke(null, numVertices);
             //Vertex.setNumEdges(numEdges);
             numEdgesMethod.invoke(null, numEdges);
-            jobIdToSuperStep.put(jobId, superStep);
-            jobIdToMove.put(jobId, toMove);
+            jobIdToSuperStep = superStep;
+            jobIdToMove = toMove;
             LOGGER.info("start iteration " + Vertex.getSuperstep());
         } catch (Exception e) {
             throw new IllegalStateException(e);
diff --git a/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/RuntimeContext.java b/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/RuntimeContext.java
index e5f74f3..854e3dc 100644
--- a/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/RuntimeContext.java
+++ b/pregelix/pregelix-dataflow/src/main/java/edu/uci/ics/pregelix/dataflow/context/RuntimeContext.java
@@ -130,23 +130,23 @@
     public synchronized void setVertexProperties(String jobId, long numVertices, long numEdges, long currentIteration,
             ClassLoader cl) {
         PJobContext activeJob = getActiveJob(jobId);
-        activeJob.setVertexProperties(jobId, numVertices, numEdges, currentIteration, cl);
+        activeJob.setVertexProperties(numVertices, numEdges, currentIteration, cl);
     }
 
     public synchronized void recoverVertexProperties(String jobId, long numVertices, long numEdges,
             long currentIteration, ClassLoader cl) {
         PJobContext activeJob = getActiveJob(jobId);
-        activeJob.recoverVertexProperties(jobId, numVertices, numEdges, currentIteration, cl);
+        activeJob.recoverVertexProperties(numVertices, numEdges, currentIteration, cl);
     }
 
     public synchronized void endSuperStep(String jobId) {
         PJobContext activeJob = getActiveJob(jobId);
-        activeJob.endSuperStep(jobId);
+        activeJob.endSuperStep();
     }
 
     public synchronized void clearState(String jobId) throws HyracksDataException {
         PJobContext activeJob = getActiveJob(jobId);
-        activeJob.clearState(jobId);
+        activeJob.clearState();
         activeJobs.remove(jobId);
     }
 
