diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py
index f80a266248f218d0c9f5f6d350b5c47a4a283ec9..9ad817c19b72cc472cb8df7504344e28884e0bcf 100644
--- a/src/dataforms_widget.py
+++ b/src/dataforms_widget.py
@@ -43,6 +43,10 @@ class DataFormWidget(gtk.Alignment, object):
     Data Form widget. Use like any other widget
     """
 
+    __gsignals__ = dict(
+        validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ())
+    )
+
     def __init__(self, dataformnode=None):
         ''' Create a widget. '''
         gtk.Alignment.__init__(self, xscale=1.0, yscale=1.0)
@@ -68,6 +72,9 @@ class DataFormWidget(gtk.Alignment, object):
         selection.connect('changed', self.on_records_selection_changed)
         selection.set_mode(gtk.SELECTION_MULTIPLE)
 
+    def on_data_form_vbox_key_press_event(self, widget, event):
+        print 'key pressed'
+
     def set_data_form(self, dataform):
         """
         Set the data form (xmpp.DataForm) displayed in widget
@@ -141,6 +148,9 @@ class DataFormWidget(gtk.Alignment, object):
         self.clean_data_form()
 
         self.singleform = SingleForm(self._data_form)
+        def _on_validated(widget):
+            self.emit('validated')
+        self.singleform.connect('validated', _on_validated)
         self.singleform.show()
         self.single_form_viewport.add(self.singleform)
         self.data_form_types_notebook.set_current_page(
@@ -299,6 +309,10 @@ class SingleForm(gtk.Table, object):
     forms, it is in another class
     """
 
+    __gsignals__ = dict(
+        validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ())
+    )
+
     def __init__(self, dataform):
         assert isinstance(dataform, dataforms.SimpleDataForm)
 
@@ -506,6 +520,11 @@ class SingleForm(gtk.Table, object):
                 commonlabelcenter = True
                 if readwrite:
                     widget = gtk.Entry()
+                    def kpe(widget, event):
+                        if event.keyval == gtk.keysyms.Return or \
+                        event.keyval == gtk.keysyms.KP_Enter:
+                            self.emit('validated')
+                    widget.connect('key-press-event', kpe)
                     widget.connect('changed', self.on_text_single_entry_changed,
                             field)
                     widget.set_sensitive(readwrite)
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index d18bdd1942c533fcc03d9c5d7d5fbf96b5753daa..8e62808848647140b0078aa145dc62629fe90d6b 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -799,9 +799,6 @@ class GroupchatControl(ChatControlBase):
                 self.btn_box.destroy()
             dataform = dataforms.ExtendForm(node=captcha)
             self.form_widget = dataforms_widget.DataFormWidget(dataform)
-            self.form_widget.show_all()
-            vbox = self.xml.get_object('gc_textviews_vbox')
-            vbox.pack_start(self.form_widget, expand=False, fill=False)
 
             def on_send_dataform_clicked(widget):
                 if not self.form_widget:
@@ -816,6 +813,11 @@ class GroupchatControl(ChatControlBase):
                 self.form_widget = None
                 del self.btn_box
 
+            self.form_widget.connect('validated', on_send_dataform_clicked)
+            self.form_widget.show_all()
+            vbox = self.xml.get_object('gc_textviews_vbox')
+            vbox.pack_start(self.form_widget, expand=False, fill=False)
+
             valid_button = gtk.Button(stock=gtk.STOCK_OK)
             valid_button.connect('clicked', on_send_dataform_clicked)
             self.btn_box = gtk.HButtonBox()