Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6636)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 6637)
@@ -307,4 +307,12 @@
     target = 'accommodation'
 
+class HistoryViewActionButton(PlainActionButton):
+    grok.order(7)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.viewStudents')
+    text = 'History'
+    target = 'history'
+
 class StudentBaseManageFormPage(WAeUPEditFormPage):
     """ View to edit student base data
@@ -445,2 +453,18 @@
     def label(self):
         return '%s: Accommodation Data' % self.context.__parent__.name
+
+class StudentHistoryPage(WAeUPPage):
+    """ Page to display student clearance data
+    """
+    grok.context(IStudent)
+    grok.name('history')
+    grok.require('waeup.viewStudents')
+    grok.template('studenthistory')
+
+    @property
+    def title(self):
+        return 'Student: %s' % self.context.name
+
+    @property
+    def label(self):
+        return '%s: History' % self.context.name
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studenthistory.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studenthistory.pt	(revision 6637)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/studenthistory.pt	(revision 6637)
@@ -0,0 +1,9 @@
+<h2 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h2>
+
+<div class="workflow">
+  <div tal:repeat="msg context/history/messages">
+    <span tal:replace="msg">message</span><br />
+  </div>
+</div>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6636)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/container.py	(revision 6637)
@@ -26,6 +26,8 @@
 from waeup.sirp.students.payments import StudentPayments
 from waeup.sirp.students.accommodation import StudentAccommodation
+from waeup.sirp.utils.helpers import get_current_principal
+from waeup.sirp.utils.logger import Logger
 
-class StudentsContainer(grok.Container):
+class StudentsContainer(grok.Container, Logger):
     """
     The node containing the student models
@@ -53,2 +55,17 @@
         self[student.student_id]['accommodation'] = accommodation
         return
+
+    logger_name = 'waeup.sirp.${sitename}.students'
+    logger_filename = 'students.log'
+
+    def logger_info(self, target, ob_class, comment=None):
+        """Get the logger's info method.
+        """
+        user = get_current_principal()
+        if user is None:
+            user = 'system'
+        else:
+            user = user.id
+        self.logger.info('%s - %s - %s - %s' % (
+                user, target, ob_class, comment))
+        return
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6636)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 6637)
@@ -1,5 +1,5 @@
 ##
 ## interfaces.py
-from zope.interface import Interface
+from zope.interface import Interface, Attribute
 from zope import schema
 from waeup.sirp.interfaces import IWAeUPObject
@@ -8,4 +8,11 @@
     """Representation of student base data.
     """
+    history = Attribute('Object history, a list of messages.')
+    state = Attribute('Returns the registration state of a student')
+
+    def loggerInfo(ob_class, comment):
+        """Adds an INFO message to the log file
+        """
+
     student_id = schema.TextLine(
         title = u'Student Id',
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py	(revision 6636)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/student.py	(revision 6637)
@@ -21,4 +21,6 @@
 from zope.component.interfaces import IFactory
 from zope.interface import implementedBy
+from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
+from waeup.sirp.interfaces import IObjectHistory
 from waeup.sirp.students.interfaces import IStudent
 from waeup.sirp.utils.helpers import attrs_to_fields
@@ -33,6 +35,20 @@
     def __init__(self):
         super(Student, self).__init__()
-        #IWorkflowInfo(self).fireTransition('init')
+        IWorkflowInfo(self).fireTransition('create')
         return
+
+    def loggerInfo(self, ob_class, comment=None):
+        target = self.__name__
+        return grok.getSite()['students'].logger_info(ob_class,target,comment)
+
+    @property
+    def state(self):
+        state = IWorkflowState(self).getState()
+        return state
+
+    @property
+    def history(self):
+        history = IObjectHistory(self)
+        return history
 
 # Set all attributes of Student required in IStudent as field
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 6636)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 6637)
@@ -91,4 +91,5 @@
         self.payments_student_path = self.student_path + '/payments'
         self.accommodation_student_path = self.student_path + '/accommodation'
+        self.history_student_path = self.student_path + '/history'
 
         # Populate university
@@ -231,3 +232,9 @@
         self.assertEqual(self.browser.url, self.accommodation_student_path)
 
+        self.browser.open(self.student_path)
+        self.browser.getLink("History").click()
+        self.assertEqual(self.browser.headers['Status'], '200 Ok')
+        self.assertEqual(self.browser.url, self.history_student_path)
+        self.assertMatches('...Student object created by system...', self.browser.contents)
+
         return
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py	(revision 6637)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py	(revision 6637)
@@ -0,0 +1,66 @@
+"""Workflow for students.
+"""
+import grok
+from datetime import datetime
+from hurry.workflow.workflow import Transition, WorkflowState, NullCondition
+from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent
+from waeup.sirp.students.interfaces import IStudent
+from waeup.sirp.interfaces import IObjectHistory, IWAeUPWorkflowInfo
+from waeup.sirp.workflow import WAeUPWorkflow, WAeUPWorkflowInfo
+
+CREATED = 'created'
+ADMITTED = 'admitted'
+
+REGISTRATION_TRANSITIONS = (
+    Transition(
+        transition_id = 'create',
+        title = 'Create student',
+        source = None,
+        condition = NullCondition,
+        msg = 'Student object created',
+        destination = CREATED),
+
+    Transition(
+        transition_id = 'admit',
+        title = 'Admit student',
+        msg = 'Student admitted',
+        source = CREATED,
+        destination = ADMITTED),
+
+    Transition(
+        transition_id = 'reset1',
+        title = 'Reset student',
+        msg = 'Student reset',
+        source = ADMITTED,
+        destination = CREATED),
+    )
+
+registration_workflow = WAeUPWorkflow(REGISTRATION_TRANSITIONS)
+
+class RegistrationWorkflowState(WorkflowState, grok.Adapter):
+    """An adapter to adapt Student objects to workflow states.
+    """
+    grok.context(IStudent)
+    grok.provides(IWorkflowState)
+
+    state_key = 'wf.registration.state'
+    state_id = 'wf.registration.id'
+
+class RegistrationWorkflowInfo(WAeUPWorkflowInfo, grok.Adapter):
+    """Adapter to adapt Student objects to workflow info objects.
+    """
+    grok.context(IStudent)
+    grok.provides(IWAeUPWorkflowInfo)
+
+    def __init__(self, context):
+        self.context = context
+        self.wf = registration_workflow
+
+@grok.subscribe(IStudent, IWorkflowTransitionEvent)
+def handle_student_transition_event(obj, event):
+    """Append message to student history when transition happened.
+    """
+    msg = '%s' % event.transition.user_data['msg']
+    history = IObjectHistory(obj)
+    history.addMessage(msg)
+    return
