diff --git a/product/Formulator/FormToXML.py b/product/Formulator/FormToXML.py
index 7af2f4c13ea939e6ea7b68509331be406d58761e..ef879a12ae129088bca95eac600aa5fa06d59af9 100644
--- a/product/Formulator/FormToXML.py
+++ b/product/Formulator/FormToXML.py
@@ -21,14 +21,12 @@ def formToXML(form, prologue=1):
         else:
           value = 'false'
       sub_element = SubElement(form_as_xml, id)
-      sub_element.text = str(value)
-      if six.PY2:
-        sub_element.text = str2unicode(sub_element.text, encoding)
+      sub_element.text = str2unicode(str(value), encoding)
     groups = SubElement(form_as_xml, 'groups')
     # export form groups
     for group in form.get_groups(include_empty=1):
       group_element = SubElement(groups, 'group')
-      group_element.append(E.title(group))
+      group_element.append(E.title(str2unicode(group, encoding)))
 
       fields = SubElement(group_element, 'fields')
       for field in form.get_fields_in_group(group, include_disabled=1):
@@ -59,24 +57,19 @@ def formToXML(form, prologue=1):
             if not isinstance(value, six.string_types):
               value = str(value)
             value_element = SubElement(values_element, key)
-          value_element.text = str(value)
-          if six.PY2:
-            value_element.text = str2unicode(value_element.text, encoding)
+          value_element.text = str2unicode(str(value), encoding)
 
         tales_element = SubElement(field_element, 'tales')
         items = sorted(field.tales.items())
         for key, value in items:
           if value:
             tale_element = SubElement(tales_element, key)
-            tale_element.text = str(value._text)
-            if six.PY2:
-              tale_element.text = str2unicode(tale_element.text, encoding)
+            tale_element.text = str2unicode(str(value._text), encoding)
+
         messages = SubElement(field_element, 'messages')
         for message_key in field.get_error_names():
           message_element = SubElement(messages, 'message', name=message_key)
-          message_element.text = field.get_error_message(message_key)
-          if six.PY2:
-            message_element.text = str2unicode(message_element.text, encoding)
+          message_element.text = str2unicode(field.get_error_message(message_key), encoding)
         # Special attribute for ProxyFields *delegated_list*
         delegated_list = getattr(field, 'delegated_list', [])
         if delegated_list:
@@ -90,6 +83,4 @@ def formToXML(form, prologue=1):
     else:
       xml = etree.tostring(form_as_xml, encoding=form.stored_encoding,
                                     xml_declaration=True, pretty_print=True)
-    if six.PY3:
-      xml = bytes2str(xml)
-    return xml
+    return bytes2str(xml)
diff --git a/product/Formulator/tests/testSerializeForm.py b/product/Formulator/tests/testSerializeForm.py
index 0c20821482877aa2f46982668dc79dc08abc02cc..a5974224f4b2a317828139f24a1ec4c2153e535c 100644
--- a/product/Formulator/tests/testSerializeForm.py
+++ b/product/Formulator/tests/testSerializeForm.py
@@ -189,6 +189,41 @@ class SerializeTestCase(unittest.TestCase):
         # if we have forgotten something, this will usually remind us ;-)
         self.assertEqual(form.render(), form2.render())
 
+    def test_encoding(self):
+        """test a form with non ascii string
+        """
+        form = ZMIForm('test', '<EncodingTest>')
+        form.name = 'name'
+        form.add_group('àbcdé')
+
+        form.manage_addField('string_field', 'string Field héhé', 'StringField')
+        form.manage_addField('int_field', 'int Field héhé', 'IntegerField')
+        form.manage_addField('float_field', 'Float Field héhé', 'FloatField')
+        form.manage_addField('date_field', 'Date Field héhé', 'DateTimeField')
+        form.manage_addField('list_field', 'List Field héhé', 'ListField')
+        form.manage_addField('multi_field', 'Checkbox Field héhé', 'MultiCheckBoxField')
+
+        form2 = ZMIForm('test2', 'ValueTest')
+
+        xml = formToXML(form)
+        XMLToForm(xml, form2)
+
+        for field in form.get_fields():
+            self.assertTrue(form2.has_field(field.getId()))
+            field2 = getattr(form2, field.getId())
+            self.assertEqual(field.values, field2.values)
+            # test if default renderings are the same
+            self.assertEqual(field.render(), field2.render())
+
+        self.assertEqual(form.title, form2.title)
+        self.assertEqual(form.name, form2.name)
+        self.assertEqual(form.action, form2.action)
+        self.assertEqual(form.enctype, form2.enctype)
+        self.assertEqual(form.method, form2.method)
+
+        # if we have forgotten something, this will usually remind us ;-)
+        self.assertEqual(form.render(), form2.render())
+
 
     def test_messages(self):
         """ test if the error messages are exported