diff --git a/opentech/apply/templates/apply/demo_workflow.html b/opentech/apply/templates/apply/demo_workflow.html
index e81ec67c70b4b5dc5c4df1180b497345e1c25149..6817653d77a9c629e74036f2b1c1d425922115f5 100644
--- a/opentech/apply/templates/apply/demo_workflow.html
+++ b/opentech/apply/templates/apply/demo_workflow.html
@@ -17,7 +17,8 @@
         <section class="container">
             <h2>{{ workflow}}</h2>
             <h3>{{ phase.stage }}</h3>
-            <h4>{{ phase.name }}</h4>
+            <h4>OTF: {{ phase.name }}</h4>
+            <h4>Public: {{ phase.public_name }}</h4>
             <form method="post">
             {% csrf_token %}
             <input id="current" type="hidden" name="current" value="{{ phase }}" />
diff --git a/opentech/apply/tests/test_workflow.py b/opentech/apply/tests/test_workflow.py
index 770c5091bf71ca21c58d53275b3e2d4d554c2c94..5770b0d66f7431aeb4fbad149b4dfdb6eb0f089e 100644
--- a/opentech/apply/tests/test_workflow.py
+++ b/opentech/apply/tests/test_workflow.py
@@ -69,6 +69,23 @@ class TestPhaseCreation(SimpleTestCase):
         phase = PhaseFactory(actions=actions)
         self.assertEqual(phase[action.name], action)
 
+    def test_uses_name_if_no_public(self):
+        phase = Phase('Phase Name')
+        self.assertEqual(phase.public_name, phase.name)
+
+    def test_uses_public_if_provided(self):
+        public_name = 'Public Name'
+        phase = Phase('Phase Name', public_name=public_name)
+        self.assertEqual(phase.public_name, public_name)
+        self.assertNotEqual(phase.public_name, phase.name)
+
+    def test_uses_public_if_provided_on_class(self):
+        class NewPhase(Phase):
+            public_name = 'Public Name'
+        phase = NewPhase('Phase Name')
+        self.assertEqual(phase.public_name, NewPhase.public_name)
+        self.assertNotEqual(phase.public_name, phase.name)
+
 
 class TestActions(SimpleTestCase):
     def test_can_create_action(self):
diff --git a/opentech/apply/workflow.py b/opentech/apply/workflow.py
index dd24aa001f0b802580a884b4d25e2749352579d7..c7ff5b1582fea7467bbba6651e7e2c6acc148d98 100644
--- a/opentech/apply/workflow.py
+++ b/opentech/apply/workflow.py
@@ -115,10 +115,17 @@ class Stage:
 class Phase:
     actions: Sequence['Action'] = list()
     name: str = ''
+    public_name: str = ''
 
-    def __init__(self, name: str='') -> None:
+    def __init__(self, name: str='', public_name:str = '') -> None:
         if name:
             self.name = name
+
+        if public_name:
+            self.public_name = public_name
+        elif not self.public_name:
+            self.public_name = self.name
+
         self._internal = slugify(self.name)
         self.stage: Union['Stage', None] = None
         self._actions = {action.name: action for action in self.actions}
@@ -160,10 +167,8 @@ class ChangePhaseAction(Action):
 
     def process(self, phase: 'Phase') -> Union['Phase', None]:
         if isinstance(self.target_phase, str):
-            phase = globals()[self.target_phase]
-        else:
-            phase = self.target_phase
-        return phase
+            return phase.stage.current(self.target_phase, '0')
+        return self.target_phase
 
 
 class NextPhaseAction(Action):
@@ -182,16 +187,19 @@ next_phase = NextPhaseAction('Progress')
 
 class ReviewPhase(Phase):
     name = 'Internal Review'
+    public_name = 'In review'
     actions = [NextPhaseAction('Close Review')]
 
 
 class DeterminationWithProgressionPhase(Phase):
     name = 'Under Discussion'
+    public_name = 'In review'
     actions = [progress_stage, reject_action]
 
 
 class DeterminationWithNextPhase(Phase):
     name = 'Under Discussion'
+    public_name = 'In review'
     actions = [NextPhaseAction('Open Review'), reject_action]