diff --git a/opentech/apply/tests/test_workflow.py b/opentech/apply/tests/test_workflow.py
index 5300cc4464ac9954f9a52a67cbad57eef40954f2..79d090c861c248c804bfcab6310374bfe15bc6bf 100644
--- a/opentech/apply/tests/test_workflow.py
+++ b/opentech/apply/tests/test_workflow.py
@@ -27,6 +27,10 @@ class TestWorkflowCreation(SimpleTestCase):
         workflow = WorkflowFactory(num_stages=2, stages__num_phases=1)
         self.assertEqual(workflow.next(workflow.stages[0].phases[0]), workflow.stages[1].phases[0])
 
+    def test_returns_next_phase_shared_name(self):
+        workflow = WorkflowFactory(num_stages=1, stages__num_phases=3, stages__phases__name='the_same')
+        self.assertEqual(workflow.next(workflow.stages[0].phases[0]), workflow.stages[0].phases[1])
+
 
 class TestStageCreation(SimpleTestCase):
     def test_can_create_stage(self):
diff --git a/opentech/apply/workflow.py b/opentech/apply/workflow.py
index 07aad2966c331df9f0e87ebd7633f7aec6cfd081..6476941d31896caeb62c2321cbd524c00b8a5cd1 100644
--- a/opentech/apply/workflow.py
+++ b/opentech/apply/workflow.py
@@ -7,11 +7,16 @@ class Workflow:
     def __init__(self, name: str, stages: Sequence['Stage']) -> None:
         self.name = name
         self.stages = stages
-        self.mapping = {
-            str(phase): (i, j)
-            for i, stage in enumerate(stages)
-            for j, phase in enumerate(stage)
-        }
+        self.mapping = self.build_mapping(stages)
+
+    def build_mapping(self, stages):
+        mapping = {}
+        for i, stage in enumerate(stages):
+            for j, phase in enumerate(stage):
+                while str(phase) in mapping:
+                    phase.occurance += 1
+                mapping[str(phase)] = (i, j)
+        return mapping
 
     def current_index(self, phase: Union['Phase', str, None]):
         if isinstance(phase, Phase):
@@ -52,6 +57,7 @@ class Stage(Iterable['Phase']):
 class Phase:
     def __init__(self, name: str) -> None:
         self.name = name
+        self.occurance = 0
 
     def __str__(self):
-        return '__'.join([self.stage.name, self.name])
+        return '__'.join([self.stage.name, self.name, str(self.occurance)])