Index: /main/waeup.kofa/trunk/src/waeup/kofa/objecthistory.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/objecthistory.py	(revision 9011)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/objecthistory.py	(revision 9012)
@@ -78,2 +78,16 @@
         self._annotations[self.history_key] = msgs
         return
+
+    def modifyMessages(self, old, new):
+        """Replaces the message (history entry) in msg.
+
+        Substring 'old' .will be replaced by 'new' in all
+        messages.
+        """
+        old_msgs = self._getMessages()
+        new_msgs = PersistentList()
+        for msg in old_msgs:
+            new_msg = msg.replace(old, new)
+            new_msgs.append(new_msg)
+        self._annotations[self.history_key] = new_msgs
+        return
Index: /main/waeup.kofa/trunk/src/waeup/kofa/tests/test_objecthistory.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/tests/test_objecthistory.py	(revision 9011)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/tests/test_objecthistory.py	(revision 9012)
@@ -91,4 +91,14 @@
         self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blah by Bob', result)
 
+    def test_modify_messages(self):
+        principal = Principal('bob')
+        principal.title = 'Bob'
+        newInteraction(Participation(principal)) # set current user
+        hist = IObjectHistory(self.obj)
+        hist.addMessage('blah')
+        hist.modifyMessages('blah', 'blow')
+        result = ''.join(hist.messages)
+        self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blow by Bob', result)
+
     def test_messages(self):
         # we get messages as a persistent list of strings
Index: /main/waeup.kofa/trunk/src/waeup/kofa/utils/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/utils/browser.py	(revision 9011)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/utils/browser.py	(revision 9012)
@@ -23,6 +23,14 @@
 from zope.component import queryUtility, getUtility, createObject
 from waeup.kofa.browser.layout import UtilityView
+from waeup.kofa.interfaces import IObjectHistory
 
 from waeup.kofa.interfaces import IUniversity
+
+def replaceStudentMessages(old, new):
+    students = grok.getSite()['students']
+    for student in students.values():
+        history = IObjectHistory(student)
+        history.modifyMessages(old, new)
+    return
 
 class ReindexPage(UtilityView, grok.View):
@@ -55,2 +63,24 @@
         self.redirect(self.url(self.context, '@@index'))
         return
+
+class ModifyAllStudentHistory(UtilityView, grok.View):
+    """ View to modify all student histories.
+
+    """
+    grok.context(IUniversity)
+    grok.name('modify_student_history')
+    grok.require('waeup.managePortal')
+
+    def update(self,old=None, new=None):
+        if None in (old, new):
+            self.flash('Syntax: /modify_student_history?old=[old string]&new=[new string]')
+            return
+        replaceStudentMessages(old, new)
+        self.context.logger.info(
+            "'%s' replaced by '%s' in all student histories." % (old, new))
+        self.flash('Finished')
+        return
+
+    def render(self):
+        self.redirect(self.url(self.context, '@@index'))
+        return
Index: /main/waeup.kofa/trunk/src/waeup/kofa/utils/tests/test_browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/utils/tests/test_browser.py	(revision 9011)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/utils/tests/test_browser.py	(revision 9012)
@@ -33,10 +33,31 @@
 from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase
 
+from waeup.kofa.utils.browser import replaceStudentMessages
 from waeup.kofa.students.tests.test_browser import StudentsFullSetup
 
 class UtilsUITests(StudentsFullSetup):
-    # Tests for Student class views and pages
 
     layer = FunctionalLayer
+
+    def test_replace_student_messages(self):
+        self.assertTrue('Student record created by system' in
+            self.student.history.messages[0])
+        replaceStudentMessages('system', 'me')
+        self.assertTrue('Student record created by me' in
+            self.student.history.messages[0])
+
+    def test_modify_all_student_history(self):
+        self.assertTrue('Student record created by system' in
+            self.student.history.messages[0])
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open('http://localhost/app/modify_student_history')
+        self.assertTrue(
+            'Syntax: /modify_student_history?old=[old string]&new=[new string]'
+            in self.browser.contents)
+        self.browser.open(
+            'http://localhost/app/modify_student_history?old=by system&new=by me')
+        self.assertTrue('Finished' in self.browser.contents)
+        self.assertTrue('Student record created by me' in
+            self.student.history.messages[0])
 
     def test_reindex(self):
