Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/import_steps.xml
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/import_steps.xml	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/import_steps.xml	(revision 2737)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<import-steps>
+ <import-step id="migrateToPackage" version="20100720-01"
+              handler="quintagroup.pfg.captcha.setuphandlers.migrateToPackage"
+              title="Collect old Products.qPloneCaptchaFields fields">
+    Collect old Products.qPloneCaptchaFields fields.
+ </import-step>
+ <import-step id="typeinfo" version="20040630-01"
+              handler="Products.CMFCore.exportimport.typeinfo.importTypesTool"
+              title="Types Tool">
+  <dependency step="componentregistry"/>
+  <dependency step="migrateToPackage"/>
+    Import types tool's type information objects.
+ </import-step>
+ <import-step id="afterTypesTool" version="20100720-01"
+              handler="quintagroup.pfg.captcha.setuphandlers.afterTypesTool"
+              title="Migrate old Products.qPloneCaptchaField to quintagroup.pfg.captcha fields">
+  <dependency step="typeinfo"/>
+    Migrate old Products.qPloneCaptchaField to quintagroup.pfg.captcha fields.
+ </import-step>
+</import-steps>
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/metadata.xml
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/metadata.xml	(revision 2295)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/metadata.xml	(revision 2737)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
 <metadata>
-  <version>0.2.2</version>
+  <version>0.3</version>
   <dependencies>
     <dependency>profile-Products.PloneFormGen:default</dependency>
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup.pfg.captcha_default.txt
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup.pfg.captcha_default.txt	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup.pfg.captcha_default.txt	(revision 2737)
@@ -0,0 +1,1 @@
+#
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup_pfg_captcha.txt
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup_pfg_captcha.txt	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/profiles/default/quintagroup_pfg_captcha.txt	(revision 2737)
@@ -0,0 +1,1 @@
+#
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/setuphandlers.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/setuphandlers.py	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/setuphandlers.py	(revision 2737)
@@ -0,0 +1,40 @@
+import logging
+from zope.component import queryMultiAdapter
+
+logger = logging.getLogger('quintagroup.pfg.captcha')
+
+captcha_fields = []
+
+def migrateToPackage(context):
+    """Collect old Products.qPloneCaptchaFields fields (before types tool setup).
+    """
+    global captcha_fields
+    if context.readDataFile('quintagroup.pfg.captcha_default.txt') is None:
+        return
+
+    site = context.getSite()
+    plone_tools = queryMultiAdapter((site, site.REQUEST), name="plone_tools")
+    ptypes = plone_tools.types()
+    cftype = getattr(ptypes, 'CaptchaField', None)
+    if cftype and getattr(cftype, 'product', "") == "qPloneCaptchaField":
+        catalog = plone_tools.catalog()
+        captcha_fields = [(cf.id, cf.getObject().aq_parent) \
+                          for cf in catalog.search({'portal_type':'CaptchaField'})]
+        logger.info("Old Products.qPloneCaptchaField fields collected.")
+
+
+def afterTypesTool(context):
+    """ Replace old qPloneCaptchaField with new quintagroup.pfg.captcha fields
+    (after types tool setup).
+    """
+    global captcha_fields
+
+    if context.readDataFile('quintagroup.pfg.captcha_default.txt') is None:
+        return
+
+    while captcha_fields:
+        cf_id, form = captcha_fields.pop()
+        form.manage_delObjects(cf_id)
+        form.invokeFactory("CaptchaField", cf_id)
+        logger.info("Fixed CaptchaField in '%s'" % form.getId())
+    logger.info("Finish Captcha field fixing")
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests.py	(revision 2295)
+++ 	(revision )
@@ -1,178 +1,0 @@
-import re
-import string
-import unittest
-
-from Products.Five import zcml
-from Products.Five import fiveconfigure
-from Testing import ZopeTestCase as ztc
-from Products.PloneTestCase.layer import onsetup
-from Products.PloneTestCase import PloneTestCase as ptc
-from Products.CMFCore.permissions import View
-from Products.Archetypes.atapi import StringField
-from Products.Archetypes.Registry import availableWidgets
-from Products.validation import validation
-
-from quintagroup.pfg.captcha import CaptchaField
-from quintagroup.pfg.captcha import CaptchaWidget
-from quintagroup.pfg.captcha import CaptchaValidator
-from quintagroup.pfg.captcha.widget import CAPTCHA_MACRO
-from quintagroup.pfg.captcha.field import CAPTCHA_ID, HIDDEN_FIELDS
-
-_marker = object()
-PACKAGES = [
-    'quintagroup.captcha.core',
-    'quintagroup.pfg.captcha',
-]
-PROFILES = [p+':default' for p in PACKAGES]
-REQUIREMENTS = ['PloneFormGen',] + PACKAGES
-
-@onsetup
-def setup_product():
-    fiveconfigure.debug_mode = True
-    import quintagroup.pfg.captcha
-    zcml.load_config('configure.zcml', quintagroup.pfg.captcha)
-    fiveconfigure.debug_mode = False
-    ztc.installProduct('PloneFormGen')
-    ztc.installPackage('quintagroup.pfg.captcha')
-    ztc.installPackage('quintagroup.captcha.core')
-
-setup_product()
-ptc.setupPloneSite(products=['PloneFormGen',], extension_profiles=PROFILES)
-
-
-class TestInstallations(ptc.PloneTestCase):
-
-    def testInstalledProducts(self):
-        qi = self.portal.portal_quickinstaller
-        installed = [p['id'] for p in qi.listInstalledProducts()]
-        for p in REQUIREMENTS:
-            if p.startswith('Products'):
-                p = p[9:]
-            self.assertEqual(p in installed, True,
-                '"%s" product not installed' % p)
-
-    def testType(self):
-        pt = self.portal.portal_types
-        self.assertEqual("CaptchaField" in pt.objectIds(), True)
-
-    def testPortalFactory(self):
-        pf = self.portal.portal_factory
-        self.assertEqual("CaptchaField" in pf.getFactoryTypes(), True)
-
-    def testWorkflow(self):
-        pw = self.portal.portal_workflow
-        default_chain = pw.getDefaultChain()
-        cf_chain = pw.getChainForPortalType('CaptchaField')
-        self.assertNotEqual(cf_chain == default_chain , True)
-
-    def testNotToList(self):
-        navtree = self.portal.portal_properties.navtree_properties
-        mtNotToList = navtree.getProperty("metaTypesNotToList")
-        self.assertEqual('CaptchaField' in mtNotToList, True)
-
-    def testSkins(self):
-        ps = self.portal.portal_skins
-        self.assertEqual("qplonecaptchafield" in ps.objectIds(), True)
-        for sname, spath in ps.getSkinPaths():
-            paths = filter(None, map(string.strip, spath.split(',')))
-            self.assertEqual("qplonecaptchafield" in paths, True,
-                '"qplonecaptchafield" layer not present in "%s" skin' % sname)
-
-
-class TestCaptchaField(ptc.PloneTestCase):
-
-    def afterSetUp(self):
-        self.folder.invokeFactory('FormFolder', 'ff1')
-        self.ff1 = getattr(self.folder, 'ff1')
-        self.ff1.invokeFactory('CaptchaField', 'captcha_field')
-
-    def testId(self):
-        """CaptchaField has always CAPTCHA_ID id."""
-        self.assertEqual(CAPTCHA_ID in self.ff1, True)
-        self.assertNotEqual('captcha_field' in self.ff1, True)
-
-    def testSchema(self):
-        cf = getattr(self.ff1, CAPTCHA_ID)
-        schema = cf.Schema()
-        for field in HIDDEN_FIELDS:
-            visibility = schema[field].widget.visible
-            self.assertEqual(visibility, {'view':'invisible','edit':'invisible'},
-                '"%s" field is not hidden, but %s:' % (field, visibility))
-
-    def testFGField(self):
-        cf = getattr(self.ff1, CAPTCHA_ID)
-        fgField = getattr(cf, 'fgField', _marker)
-        self.assertNotEqual(fgField, _marker)
-        # Test fgField properties
-        self.assertEqual(type(fgField), StringField)
-        self.assertEqual(bool(fgField.searchable), False )
-        self.assertEqual(fgField.write_permission, View)
-        self.assertEqual(type(fgField.widget), CaptchaWidget)
-        validators = [v.__class__ for v in fgField.validators._chain]
-        self.assertEqual(CaptchaValidator in validators, True)
-
-
-class TestCaptchaWidget(ptc.PloneTestCase):
-
-    CF = CaptchaField.__module__ + '.CaptchaField'
-    CW = CaptchaWidget.__module__ + '.CaptchaWidget'
-
-    def afterSetUp(self):
-        self.widgets = dict(availableWidgets())
-
-    def testRegistration(self):
-        self.assertEqual(self.CW in self.widgets, True)
-        cw = self.widgets[self.CW]
-        self.assertEqual(self.CF in cw.used_for, True)
-
-    def testWidgetMacro(self):
-        widget_macro = self.widgets[self.CW].klass._properties['macro']
-        self.assertEqual(widget_macro, CAPTCHA_MACRO)
-
-    def testWidgetMacroAccessable(self):
-        macro = self.portal.restrictedTraverse(CAPTCHA_MACRO)
-        self.assertNotEqual(macro, None)
-
-
-class TestCaptchaValidator(ptc.PloneTestCase):
-
-    def getValidator(self):
-        return validation.validatorFor('isCaptchaCorrect')        
-
-    def testRegistration(self):
-        self.assertEqual(self.getValidator().__class__, CaptchaValidator)
-
-    def patchCoreValidator(self, status, error=""):
-        # Patch quintagroup.catpcha.core' captcha_validator
-        class MockState:
-            def __init__(self, status, error=""):
-                self.status = status
-                self.errors = {'key':[error,]}
-
-        patch_validator = lambda : MockState(status, error)
-        self.portal.captcha_validator = patch_validator
-
-    def testValidationSuccess(self):
-        # PFG validator must call patched quintagroup.captcha.core'
-        # captcha_validator and successfully validate the data.
-        validator = self.getValidator()
-        self.patchCoreValidator("success")
-        result = validator('test', instance=self.portal)
-        self.assertEqual(result, 1)
-        
-    def testValidationFailure(self):
-        # PFG validator must call patched quintagroup.captcha.core'
-        # captcha_validator and return error.
-        validator = self.getValidator()
-        self.patchCoreValidator("failure", "Wrong value")
-        result = validator('test', instance=self.portal)
-        self.assertEqual(result, "Wrong value")
-
-
-def test_suite():
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(TestInstallations))
-    suite.addTest(unittest.makeSuite(TestCaptchaField))
-    suite.addTest(unittest.makeSuite(TestCaptchaWidget))
-    suite.addTest(unittest.makeSuite(TestCaptchaValidator))
-    return suite
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/base.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/base.py	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/base.py	(revision 2737)
@@ -0,0 +1,65 @@
+import re
+import string
+import unittest
+import transaction
+
+from Products.Five import zcml
+from Products.Five import fiveconfigure
+from Testing import ZopeTestCase as ztc
+
+from Products.PloneTestCase.layer import PloneSite
+from Products.PloneTestCase import setup as ptc_setup
+from Products.PloneTestCase import PloneTestCase as ptc
+
+PACKAGES = [
+    'quintagroup.captcha.core',
+    'quintagroup.pfg.captcha',
+]
+REQUIREMENTS = ['PloneFormGen',] + PACKAGES
+
+ptc.setupPloneSite()
+
+class NotInstalled(PloneSite):
+    """ Only package register, without installation into portal
+    """
+    @classmethod
+    def setUp(cls):
+        fiveconfigure.debug_mode = True
+        import quintagroup.pfg.captcha
+        zcml.load_config('configure.zcml', quintagroup.pfg.captcha)
+        fiveconfigure.debug_mode = False
+        ztc.installProduct('PloneFormGen')
+        ztc.installPackage('quintagroup.pfg.captcha')
+        ztc.installPackage('quintagroup.captcha.core')
+
+    @classmethod
+    def tearDown(cls):
+        ptc_setup.cleanupPloneSite(ptc_setup.portal_name)
+
+
+class Installed(NotInstalled):
+    """ Install product into the portal
+    """
+    @classmethod
+    def setUp(cls):
+        app = ztc.app()
+        portal = app[ptc_setup.portal_name]
+
+        # Sets the local site/manager
+        ptc_setup._placefulSetUp(portal)
+        # Install PROJECT
+        qi = getattr(portal, 'portal_quickinstaller', None)
+        qi.installProduct("quintagroup.pfg.captcha")
+        transaction.commit()
+
+    @classmethod
+    def tearDown(cls):
+        ptc_setup._placefulTearDown()
+        
+
+class TestCase(ptc.PloneTestCase):
+    layer = Installed
+
+
+class TestCaseNotInstalled(ptc.PloneTestCase):
+    layer = NotInstalled
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testInstalled.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testInstalled.py	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testInstalled.py	(revision 2737)
@@ -0,0 +1,151 @@
+from base import *
+
+from Products.CMFCore.permissions import View
+from Products.Archetypes.atapi import StringField
+from Products.Archetypes.Registry import availableWidgets
+from Products.validation import validation
+
+from quintagroup.pfg.captcha import CaptchaField
+from quintagroup.pfg.captcha import CaptchaWidget
+from quintagroup.pfg.captcha import CaptchaValidator
+from quintagroup.pfg.captcha.widget import CAPTCHA_MACRO
+from quintagroup.pfg.captcha.field import CAPTCHA_ID, HIDDEN_FIELDS
+
+_marker = object()
+
+class TestInstallations(TestCase):
+
+    def testInstalledProducts(self):
+        qi = self.portal.portal_quickinstaller
+        installed = [p['id'] for p in qi.listInstalledProducts()]
+        for p in REQUIREMENTS:
+            if p.startswith('Products'):
+                p = p[9:]
+            self.assertEqual(p in installed, True,
+                '"%s" product not installed' % p)
+
+    def testType(self):
+        pt = self.portal.portal_types
+        self.assertEqual("CaptchaField" in pt.objectIds(), True)
+
+    def testPortalFactory(self):
+        pf = self.portal.portal_factory
+        self.assertEqual("CaptchaField" in pf.getFactoryTypes(), True)
+
+    def testWorkflow(self):
+        pw = self.portal.portal_workflow
+        default_chain = pw.getDefaultChain()
+        cf_chain = pw.getChainForPortalType('CaptchaField')
+        self.assertNotEqual(cf_chain == default_chain , True)
+
+    def testNotToList(self):
+        navtree = self.portal.portal_properties.navtree_properties
+        mtNotToList = navtree.getProperty("metaTypesNotToList")
+        self.assertEqual('CaptchaField' in mtNotToList, True)
+
+    def testSkins(self):
+        ps = self.portal.portal_skins
+        self.assertEqual("qplonecaptchafield" in ps.objectIds(), True)
+        for sname, spath in ps.getSkinPaths():
+            paths = filter(None, map(string.strip, spath.split(',')))
+            self.assertEqual("qplonecaptchafield" in paths, True,
+                '"qplonecaptchafield" layer not present in "%s" skin' % sname)
+
+
+class TestCaptchaField(TestCase):
+
+    def afterSetUp(self):
+        self.folder.invokeFactory('FormFolder', 'ff1')
+        self.ff1 = getattr(self.folder, 'ff1')
+        self.ff1.invokeFactory('CaptchaField', 'captcha_field')
+
+    def testId(self):
+        """CaptchaField has always CAPTCHA_ID id."""
+        self.assertEqual(CAPTCHA_ID in self.ff1, True)
+        self.assertNotEqual('captcha_field' in self.ff1, True)
+
+    def testSchema(self):
+        cf = getattr(self.ff1, CAPTCHA_ID)
+        schema = cf.Schema()
+        for field in HIDDEN_FIELDS:
+            visibility = schema[field].widget.visible
+            self.assertEqual(visibility, {'view':'invisible','edit':'invisible'},
+                '"%s" field is not hidden, but %s:' % (field, visibility))
+
+    def testFGField(self):
+        cf = getattr(self.ff1, CAPTCHA_ID)
+        fgField = getattr(cf, 'fgField', _marker)
+        self.assertNotEqual(fgField, _marker)
+        # Test fgField properties
+        self.assertEqual(type(fgField), StringField)
+        self.assertEqual(bool(fgField.searchable), False )
+        self.assertEqual(fgField.write_permission, View)
+        self.assertEqual(type(fgField.widget), CaptchaWidget)
+        validators = [v.__class__ for v in fgField.validators._chain]
+        self.assertEqual(CaptchaValidator in validators, True)
+
+
+class TestCaptchaWidget(TestCase):
+
+    CF = CaptchaField.__module__ + '.CaptchaField'
+    CW = CaptchaWidget.__module__ + '.CaptchaWidget'
+
+    def afterSetUp(self):
+        self.widgets = dict(availableWidgets())
+
+    def testRegistration(self):
+        self.assertEqual(self.CW in self.widgets, True)
+        cw = self.widgets[self.CW]
+        self.assertEqual(self.CF in cw.used_for, True)
+
+    def testWidgetMacro(self):
+        widget_macro = self.widgets[self.CW].klass._properties['macro']
+        self.assertEqual(widget_macro, CAPTCHA_MACRO)
+
+    def testWidgetMacroAccessable(self):
+        macro = self.portal.restrictedTraverse(CAPTCHA_MACRO)
+        self.assertNotEqual(macro, None)
+
+
+class TestCaptchaValidator(TestCase):
+
+    def getValidator(self):
+        return validation.validatorFor('isCaptchaCorrect')        
+
+    def testRegistration(self):
+        self.assertEqual(self.getValidator().__class__, CaptchaValidator)
+
+    def patchCoreValidator(self, status, error=""):
+        # Patch quintagroup.catpcha.core' captcha_validator
+        class MockState:
+            def __init__(self, status, error=""):
+                self.status = status
+                self.errors = {'key':[error,]}
+
+        patch_validator = lambda : MockState(status, error)
+        self.portal.captcha_validator = patch_validator
+
+    def testValidationSuccess(self):
+        # PFG validator must call patched quintagroup.captcha.core'
+        # captcha_validator and successfully validate the data.
+        validator = self.getValidator()
+        self.patchCoreValidator("success")
+        result = validator('test', instance=self.portal)
+        self.assertEqual(result, 1)
+        
+    def testValidationFailure(self):
+        # PFG validator must call patched quintagroup.captcha.core'
+        # captcha_validator and return error.
+        validator = self.getValidator()
+        self.patchCoreValidator("failure", "Wrong value")
+        result = validator('test', instance=self.portal)
+        self.assertEqual(result, "Wrong value")
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestInstallations))
+    suite.addTest(unittest.makeSuite(TestCaptchaField))
+    suite.addTest(unittest.makeSuite(TestCaptchaWidget))
+    suite.addTest(unittest.makeSuite(TestCaptchaValidator))
+    return suite
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testMigration.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testMigration.py	(revision 2737)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/tests/testMigration.py	(revision 2737)
@@ -0,0 +1,58 @@
+from base import *
+from Products.PloneTestCase.setup import cleanupPloneSite
+from Products.PloneTestCase.setup import portal_name
+from Products.PloneTestCase.setup import SiteCleanup
+
+class TestMigration(TestCaseNotInstalled):
+    """Migration perform recreation old CaptchaField
+    objects from qPloneCaptchaField product to new
+    CaptchaField from quintagroup.pfg.captcha package.
+
+    Migration based on:
+      * presence old portal type CaptchaField with
+        "qPloneCaptchaField" value in *product* field.
+      * presence of CaptchaField objects on the site.
+
+    This TestCase emulate migration with:
+      1. Install new quintagroup.pfg.captcha package
+         and add test CaptchaField object.
+      2. Change *product" field value in
+         portal_tyeps/CaptchaField FTI
+    Then it install quintagroup.pfg.captcha and test if
+    tested CaptchaField object is recreated and *product*
+    field for portal_type/CaptchaField is changed to
+    quintagroup.pfg.captcha.
+    """
+
+    def afterSetUp(self):
+        self.loginAsPortalOwner()
+        self.qi = self.portal.portal_quickinstaller
+        self.pt = self.portal.portal_types
+        self.prepareToMigration()
+
+    def beforeTearDown(self):
+        self.qi.uninstallProducts(["quintagroup.pfg.captcha",])
+
+    def prepareToMigration(self):
+        # Install types
+        self.addProduct("quintagroup.pfg.captcha")
+        # Add captcha field
+        self.portal.invokeFactory("FormFolder", 'test_form')
+        test_form = self.portal['test_form']
+        test_form.invokeFactory("CaptchaField", 'test_captcha_field')
+        self.cf_path = "test_form/key"
+        self.old_cf = self.portal.unrestrictedTraverse(self.cf_path) 
+        self.assert_(self.old_cf)
+        self.pt['CaptchaField'].manage_changeProperties(product="qPloneCaptchaField")
+        self.qi.manage_delObjects('quintagroup.pfg.captcha')
+
+    def testMigration(self):
+        self.addProduct("quintagroup.pfg.captcha")
+        new_cf = self.portal.unrestrictedTraverse(self.cf_path) 
+        self.assert_(self.old_cf != new_cf)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestMigration))
+    return suite
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/validator.py
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/validator.py	(revision 2295)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/validator.py	(revision 2737)
@@ -8,7 +8,9 @@
 class CaptchaValidator:
 
-    implements(IValidator)
+    __implements__ = (IValidator,)
 
     name = 'CaptchaValidator'
+    title = ""
+    description = ""
 
     def __init__(self, name, title='', description=''):
Index: quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/version.txt
===================================================================
--- quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/version.txt	(revision 2295)
+++ quintagroup.pfg.captcha/trunk/quintagroup/pfg/captcha/version.txt	(revision 2737)
@@ -1,1 +1,1 @@
-0.2.2
+0.3
