diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
index ec2be65..3e54c94 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
@@ -74,32 +74,31 @@
         return getWorkletInstance(initWorkletType);
     }
 
-
     @Override
     public ProgramCounter next(WorkflowContext context) throws WorkflowException {
 
         int cnt = 0;
 
-        ProgramCounter pc = context.current();
-        check(pc != null, "Invalid program counter");
+        ProgramCounter current = context.current();
+        check(current != null, "Invalid program counter");
 
-        for (int i = pc.workletIndex(); i < workletTypeList.size(); i++) {
+        ProgramCounter pc = current.clone();
+
+        for (int i = current.workletIndex(); i < workletTypeList.size(); pc = increased(pc), i++) {
 
             if (cnt++ > Worklet.MAX_WORKS) {
                 throw new WorkflowException("Maximum worklet execution exceeded");
             }
 
-            String workletType = workletTypeList.get(i);
-
-            if (Worklet.Common.COMPLETED.tag().equals(workletType)) {
-                return ProgramCounter.valueOf(workletType, i);
+            if (pc.isCompleted()) {
+                return pc;
             }
 
-            if (Worklet.Common.INIT.tag().equals(workletType)) {
+            if (pc.isInit()) {
                 continue;
             }
 
-            Worklet worklet = getWorkletInstance(workletType);
+            Worklet worklet = getWorkletInstance(pc);
             Class workClass = worklet.getClass();
 
             if (BranchWorklet.class.isAssignableFrom(workClass)) {
@@ -121,11 +120,12 @@
                 // isNext is read only. It does not perform 'inhale'.
                 dataModelInjector.inject(worklet, context);
                 if (worklet.isNext(context)) {
-                    return ProgramCounter.valueOf(workletType, i);
+                    return pc;
                 }
             }
         }
-        throw new WorkflowException("workflow reached to end but not COMPLETED");
+        throw new WorkflowException("workflow reached to end but not COMPLETED (pc:"
+                + current + ", workflow:" + this.toString());
     }
 
     @Override
@@ -141,6 +141,12 @@
     }
 
     @Override
+    public Worklet getWorkletInstance(ProgramCounter pc) throws WorkflowException {
+
+        return getWorkletInstance(workletTypeList.get(pc.workletIndex()));
+    }
+
+    @Override
     public Worklet getWorkletInstance(String workletType) throws WorkflowException {
 
         if (Worklet.Common.INIT.tag().equals(workletType)) {
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java
index 6af50e0..b6db8e7 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ProgramCounter.java
@@ -62,6 +62,30 @@
         this.workletIndex = workletIndex;
     }
 
+    /**
+     * Clones this workflow Program Counter.
+     * @return clone of this workflow Program Counter
+     */
+    public ProgramCounter clone() {
+        return ProgramCounter.valueOf(this.workletType(), this.workletIndex());
+    }
+
+    /**
+     * Returns whether this program counter is INIT worklet program counter.
+     * @return whether this program counter is INIT worklet program counter
+     */
+    public boolean isInit() {
+        return Worklet.Common.INIT.tag().equals(this.workletType);
+    }
+
+    /**
+     * Returns whether this program counter is COMPLETED worklet program counter.
+     * @return whether this program counter is COMPLETED worklet program counter
+     */
+    public boolean isCompleted() {
+        return Worklet.Common.COMPLETED.tag().equals(this.workletType);
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(this.toString());
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
index 848a706..1404f9b 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
@@ -56,6 +56,14 @@
 
     /**
      * Returns instance of worklet.
+     * @param pc program counter
+     * @return instance of worklet
+     * @throws WorkflowException workflow exception
+     */
+    Worklet getWorkletInstance(ProgramCounter pc) throws WorkflowException;
+
+    /**
+     * Returns instance of worklet.
      * @param workletType class name of worklet
      * @return instance of worklet
      * @throws WorkflowException workflow exception
