diff --git a/sleekxmpp/plugins/xep_0122/__init__.py b/sleekxmpp/plugins/xep_0122/__init__.py
new file mode 100644
index 00000000..65ce96a1
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0122/__init__.py
@@ -0,0 +1 @@
+from sleekxmpp.plugins.xep_0122.stanza import FormValidation
diff --git a/sleekxmpp/plugins/xep_0122/stanza.py b/sleekxmpp/plugins/xep_0122/stanza.py
new file mode 100644
index 00000000..1807b11c
--- /dev/null
+++ b/sleekxmpp/plugins/xep_0122/stanza.py
@@ -0,0 +1,83 @@
+
+from sleekxmpp.xmlstream import ElementBase, ET
+
+
+class FormValidation(ElementBase):
+ """
+ Validation values for form fields.
+
+ Example:
+
+
+
+ 2003-10-06T11:22:00-07:00
+
+ """
+
+ namespace = 'http://jabber.org/protocol/xdata-validate'
+ name = 'validate'
+ plugin_attrib = 'validate'
+ interfaces = set(('datatype', 'basic', 'open', 'range', 'regex', ))
+ sub_interfaces = set(('basic', 'open', 'range', 'regex', ))
+ plugin_attrib_map = {}
+ plugin_tag_map = {}
+
+ def _add_field(self, name):
+ item_xml = ET.Element('{%s}%s' % (self.namespace, name))
+ self.xml.append(item_xml)
+ return item_xml
+
+ def set_basic(self, value):
+ self.remove_all()
+ if value:
+ self._add_field('basic')
+
+ def set_open(self, value):
+ self.remove_all()
+ if value:
+ self._add_field('open')
+
+ def set_regex(self, regex):
+ self.remove_all()
+ if regex:
+ _regex = self._add_field('regex')
+ _regex.text = regex
+
+ def set_range(self, value, minimum=None, maximum=None):
+ self.remove_all()
+ if value:
+ _range = self._add_field('range')
+ _range.attrib['min'] = str(minimum)
+ _range.attrib['max'] = str(maximum)
+
+ def remove_all(self, except_tag=None):
+ for a in self.sub_interfaces:
+ if a != except_tag:
+ del self[a]
+
+ def get_basic(self):
+ present = self.xml.find('{%s}basic' % self.namespace)
+ return present is not None
+
+ def get_open(self):
+ present = self.xml.find('{%s}open' % self.namespace)
+ return present is not None
+
+ def get_regex(self):
+ present = self.xml.find('{%s}regex' % self.namespace)
+ if present:
+ return present.text
+
+ return False
+
+ def get_range(self):
+ present = self.xml.find('{%s}regex' % self.namespace)
+ if present:
+ return dict(present.attrib)
+
+ return False
+
+
+FormValidation.getBasic = FormValidation.get_basic
+FormValidation.setBasic = FormValidation.set_basic
diff --git a/tests/test_stanza_xep_0122.py b/tests/test_stanza_xep_0122.py
new file mode 100644
index 00000000..2330b6a2
--- /dev/null
+++ b/tests/test_stanza_xep_0122.py
@@ -0,0 +1,137 @@
+import unittest
+from sleekxmpp import Message
+from sleekxmpp.test import SleekTest
+from sleekxmpp.thirdparty import OrderedDict
+
+import sleekxmpp.plugins.xep_0004 as xep_0004
+import sleekxmpp.plugins.xep_0122 as xep_0122
+from sleekxmpp.xmlstream import register_stanza_plugin
+
+
+class TestDataForms(SleekTest):
+
+ def setUp(self):
+ register_stanza_plugin(Message, xep_0004.Form)
+ register_stanza_plugin(xep_0004.Form, xep_0004.FormField, iterable=True)
+ register_stanza_plugin(xep_0004.FormField, xep_0004.FieldOption, iterable=True)
+ register_stanza_plugin(xep_0004.FormField, xep_0122.FormValidation)
+
+ def test_basic_validation(self):
+ """Testing using multiple instructions elements in a data form."""
+ msg = self.Message()
+ form = msg['form']
+ field = form.addField(var='f1',
+ ftype='text-single',
+ label='Text',
+ desc='A text field',
+ required=True,
+ value='Some text!')
+
+ validation = field['validate']
+ validation['datatype'] = 'xs:string'
+ validation.set_basic(True)
+
+ self.check(msg, """
+
+
+
+ A text field
+
+ Some text!
+
+
+
+
+
+
+ """)
+
+ def test_open_validation(self):
+ """Testing using multiple instructions elements in a data form."""
+ msg = self.Message()
+ form = msg['form']
+ field = form.addField(var='f1',
+ ftype='text-single',
+ label='Text',
+ desc='A text field',
+ required=True,
+ value='Some text!')
+
+ validation = field['validate']
+ validation.set_open(True)
+
+ self.check(msg, """
+
+
+
+ A text field
+
+ Some text!
+
+
+
+
+
+
+ """)
+
+ def test_regex_validation(self):
+ """Testing using multiple instructions elements in a data form."""
+ msg = self.Message()
+ form = msg['form']
+ field = form.addField(var='f1',
+ ftype='text-single',
+ label='Text',
+ desc='A text field',
+ required=True,
+ value='Some text!')
+
+ validation = field['validate']
+ validation.set_regex('[0-9]+')
+
+ self.check(msg, """
+
+
+
+ A text field
+
+ Some text!
+
+ [0-9]+
+
+
+
+
+ """)
+
+ def test_range_validation(self):
+ """Testing using multiple instructions elements in a data form."""
+ msg = self.Message()
+ form = msg['form']
+ field = form.addField(var='f1',
+ ftype='text-single',
+ label='Text',
+ desc='A text field',
+ required=True,
+ value='Some text!')
+
+ validation = field['validate']
+ validation.set_range(True, minimum=0, maximum=10)
+
+ self.check(msg, """
+
+
+
+ A text field
+
+ Some text!
+
+
+
+
+
+
+ """)
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestDataForms)