Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py	(revision 6302)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser.py	(revision 6303)
@@ -31,4 +31,6 @@
 from zope.traversing.browser import absoluteURL
 
+from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
+
 from waeup.sirp.browser import (
     WAeUPPage, WAeUPEditFormPage, WAeUPAddFormPage,
@@ -61,4 +63,5 @@
 from waeup.sirp.browser.pages import add_local_role, del_local_roles
 from waeup.sirp.permissions import get_users_with_local_roles, getRoles
+from waeup.sirp.applicants.workflow import create_workflow, INITIALIZED, STARTED
 
 results_widget = CustomWidgetFactory(
@@ -393,13 +396,10 @@
         if SUBMIT is None:
             return
-
         if self.request.principal.id == 'zope.anybody':
             self.flash('Entered credentials are invalid.')
             return
-
         if not IApplicantPrincipal.providedBy(self.request.principal):
             # Don't care if user is already authenticated as non-applicant
             return
-
         pin = self.request.principal.access_code
         if pin not in self.context.keys():
@@ -408,5 +408,4 @@
             applicant.access_code = pin
             self.context[pin] = applicant
-
         # Assign current principal the owner role on created applicant
         # record
@@ -414,4 +413,7 @@
         role_manager.assignRoleToPrincipal(
             'waeup.local.ApplicationOwner', self.request.principal.id)
+        state = IWorkflowState(self.context[pin]).getState()
+        if state == INITIALIZED:
+            IWorkflowInfo(self.context[pin]).fireTransition('start')
         self.redirect(self.url(self.context[pin], 'edit'))
         return
@@ -464,4 +466,9 @@
         return 'not yet admitted'
 
+    @property
+    def getApplicationState(self):
+        state = IWorkflowState(self.context).getState()
+        return state
+
 class ApplicantsManageActionButton(ManageActionButton):
     grok.context(IApplicant)
@@ -497,8 +504,30 @@
         return '%s Application Form' % container_title
 
+    @property
+    def getTransitions(self):
+        allowed_transitions_ids = IWorkflowInfo(self.context).getManualTransitionIds()
+        transition_objects = create_workflow()
+        null_transition = [{'name': '', 'title':'No transition'}]
+        transitions = null_transition + [dict(
+            name=transition_object.transition_id,
+            title=transition_object.title)
+            for transition_object in transition_objects
+            if transition_object.transition_id in allowed_transitions_ids]
+        #import pdb; pdb.set_trace()
+        return transitions
+
+    @property
+    def getApplicationState(self):
+        state = IWorkflowState(self.context).getState()
+        return state
+
     @grok.action('Save')
     def save(self, **data):
         self.applyData(self.context, **data)
         self.context._p_changed = True
+        form = self.request.form
+        if form.has_key('transition') and form['transition']:
+            transition = form['transition']
+            IWorkflowInfo(self.context).fireTransition(transition)
         self.flash('Form has been saved.')
         return
@@ -535,4 +564,8 @@
         return False
 
+    @property
+    def getTransitions(self):
+        return None
+
     @grok.action('Save')
     def save(self, **data):
@@ -555,4 +588,10 @@
             self.flash(self.dataNotComplete())
             return
+        state = IWorkflowState(self.context).getState()
+        # Cannot happen but anyway ...
+        if state != STARTED:
+            self.flash('This form cannot be submitted.')
+            return
+        IWorkflowInfo(self.context).fireTransition('submit')
         self.context.locked = True
         self.flash('Form has been submitted.')
Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_display.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_display.pt	(revision 6302)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_display.pt	(revision 6303)
@@ -2,4 +2,7 @@
     tal:condition="view/label"
     tal:content="view/label">Label</h2>
+
+<h3>Application Status:
+  <span tal:replace="view/getApplicationState">Application State</span></h3>
 
 <table class="zebra">
@@ -11,5 +14,5 @@
         </td>
         <td>
-          <input tal:replace="structure widget" />
+          <span tal:replace="structure widget" />
         </td>
       </tr>
@@ -20,5 +23,5 @@
       </td>
       <td>
-        <input tal:replace="structure view/getCourseAdmitted" />
+        <span tal:replace="structure view/getCourseAdmitted" />
       </td>
     </tr>
Index: main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_edit.pt
===================================================================
--- main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_edit.pt	(revision 6302)
+++ main/waeup.sirp/trunk/src/waeup/sirp/applicants/browser_templates/form_edit.pt	(revision 6303)
@@ -5,4 +5,7 @@
     tal:condition="view/label"
     tal:content="view/label">Label</h2>
+
+  <h3>Application Status:
+    <span tal:replace="view/getApplicationState">Application State</span></h3>
 
   <div class="form-status"
@@ -49,4 +52,15 @@
         </tr>
       </tal:block>
+        <tr tal:condition="view/getTransitions">
+        <td class="label"><label>Application Transition:</label></td>
+        <td>
+            <select id="transition" name="transition">
+                <option tal:repeat="transition view/getTransitions" tal:attributes="value transition/name">
+                    <span tal:replace="transition/title">TRANSITIONTITLE
+                    </span>
+                </option>
+            </select>
+        </td>
+        </tr>
     </tbody>
   </table>
