Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/captcha.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/captcha.py	(revision 7307)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/captcha.py	(revision 7308)
@@ -29,4 +29,7 @@
 from zope.publisher.interfaces.http import IHTTPRequest
 from waeup.sirp.browser import WAeUPPage as SIRPPage
+from waeup.sirp.browser.interfaces import (
+    ICaptchaRequest, ICaptchaResponse, ICaptcha, ICaptchaConfig,
+    ICaptchaManager)
 from waeup.sirp.interfaces import IUniversity
 
@@ -34,77 +37,7 @@
 grok.templatedir('templates')
 
-class ICaptchaRequest(Interface):
-    """A set of data required to verify captcha solutions.
-
-    To solve a captcha we need at least a solution. Many types of
-    captchas might also need a challenge to compare whether the
-    solution is correct.
-    """
-    solution = schema.TextLine(
-        title = u'Solution string a user entered',
-        default = None,
-        )
-    challenge = schema.TextLine(
-        title = u'The challenge the solution might match',
-        default = None,
-        )
-
-class ICaptchaResponse(Interface):
-    """A formalized response for captcha solutions.
-    """
-    is_valid = schema.Bool(
-        title = u'Indicates validity of entered captcha data.',
-        default = False,
-        )
-    error_code = schema.TextLine(
-        title = u'Error when trying to validate entered captcha data.',
-        description = u'Error codes are not expected to be readable strings.',
-        default = None,
-        )
-
-class ICaptcha(Interface):
-
-    def verify(request):
-        """Verify data entered in an HTTP request.
-
-        Expects some IHTTPRequest object and returns an
-        ICaptchaResponse indicating that the solution was correct or
-        not.
-
-        If the solution could not be verified (this might also happen
-        because of technical reasons), the response might contain an
-        error code.
-        """
-
-    def display(error_code=None):
-        """Returns a piece of HTML code that displays the captcha.
-
-        The generated HTML code might depend on any previous error
-        code as returned from :meth:`verify`.
-
-        The code is expected to appear inside a ``<form>``. It
-        therefore should not contain a ``<form>`` nor any submit
-        buttons.
-        """
-
-class ICaptchaConfig(Interface):
-    """Any type of captcha might need some configuration data.
-
-    By default we require no configuration data.
-    """
-
-class ICaptchaManager(Interface):
-    """A chooser that collects available captchas.
-    """
-    def getAvailCaptchas():
-        """Return a dict of available captchas with registered names as keys.
-        """
-
-    def getCaptcha():
-        """Get captcha chosen for a certain site or default.
-        """
 
 #
-# Global captcha chooser
+# Global captcha manager
 #
 class CaptchaManager(grok.GlobalUtility):
@@ -288,4 +221,7 @@
     To render the needed HTML code, you can deploy the
     :meth:`display`` method of ``mycaptcha``.
+
+    This captcha is available at runtime as a global utility named
+    ``'ReCaptcha'``.
     """
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/interfaces.py	(revision 7307)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/interfaces.py	(revision 7308)
@@ -23,6 +23,6 @@
     IWAeUPObject, IUniversity, IUsersContainer, IDataCenter)
 from waeup.sirp.university.interfaces import (
-    IFacultyContainer, IFaculty, IFacultyAdd, IDepartment, IDepartmentAdd, 
-    ICourseContainer, ICourse, ICourseAdd, ICertificateContainer, 
+    IFacultyContainer, IFaculty, IFacultyAdd, IDepartment, IDepartmentAdd,
+    ICourseContainer, ICourse, ICourseAdd, ICertificateContainer,
     ICertificate, ICertificateAdd, ICertificateCourse, ICertificateCourseAdd)
 
@@ -77,5 +77,5 @@
         required = False,
         )
-        
+
     def getResources():
         """Get resources of the theme.
@@ -92,2 +92,73 @@
         by the `update()` method of the general site layout.
         """
+
+class ICaptchaRequest(Interface):
+    """A set of data required to verify captcha solutions.
+
+    To solve a captcha we need at least a solution. Many types of
+    captchas might also need a challenge to compare whether the
+    solution is correct.
+    """
+    solution = schema.TextLine(
+        title = u'Solution string a user entered',
+        default = None,
+        )
+    challenge = schema.TextLine(
+        title = u'The challenge the solution might match',
+        default = None,
+        )
+
+class ICaptchaResponse(Interface):
+    """A formalized response for captcha solutions.
+    """
+    is_valid = schema.Bool(
+        title = u'Indicates validity of entered captcha data.',
+        default = False,
+        )
+    error_code = schema.TextLine(
+        title = u'Error when trying to validate entered captcha data.',
+        description = u'Error codes are not expected to be readable strings.',
+        default = None,
+        )
+
+class ICaptcha(Interface):
+
+    def verify(request):
+        """Verify data entered in an HTTP request.
+
+        Expects some IHTTPRequest object and returns an
+        ICaptchaResponse indicating that the solution was correct or
+        not.
+
+        If the solution could not be verified (this might also happen
+        because of technical reasons), the response might contain an
+        error code.
+        """
+
+    def display(error_code=None):
+        """Returns a piece of HTML code that displays the captcha.
+
+        The generated HTML code might depend on any previous error
+        code as returned from :meth:`verify`.
+
+        The code is expected to appear inside a ``<form>``. It
+        therefore should not contain a ``<form>`` nor any submit
+        buttons.
+        """
+
+class ICaptchaConfig(Interface):
+    """Any type of captcha might need some configuration data.
+
+    By default we require no configuration data.
+    """
+
+class ICaptchaManager(Interface):
+    """A chooser that collects available captchas.
+    """
+    def getAvailCaptchas():
+        """Return a dict of available captchas with registered names as keys.
+        """
+
+    def getCaptcha():
+        """Get captcha chosen for a certain site or default.
+        """
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/tests/test_captcha.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/tests/test_captcha.py	(revision 7307)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/tests/test_captcha.py	(revision 7308)
@@ -23,8 +23,10 @@
 from waeup.sirp.testing import FunctionalLayer, FunctionalTestCase
 from waeup.sirp.browser.captcha import (
-    ICaptchaResponse, ICaptchaRequest, ICaptcha, ICaptchaManager)
-from waeup.sirp.browser.captcha import (
     CaptchaResponse, CaptchaRequest, NullCaptcha, StaticCaptcha, ReCaptcha,
     CaptchaManager)
+from waeup.sirp.browser.interfaces import (
+    ICaptchaRequest, ICaptchaResponse, ICaptcha, ICaptchaConfig,
+    ICaptchaManager)
+
 
 class CaptchaResponseTests(FunctionalTestCase):
