diff --git a/gajim/common/modules/register.py b/gajim/common/modules/register.py
index cb348ef77b184b1ef853bd0f8a7d3274394b26e7..37ca71d4f19ef5d9c5ccc14638ef556979a946d4 100644
--- a/gajim/common/modules/register.py
+++ b/gajim/common/modules/register.py
@@ -31,6 +31,8 @@ class Register(BaseModule):
         'unregister',
         'change_password',
         'change_password_with_form',
+        'request_register_form',
+        'submit_register_form',
     ]
 
     def __init__(self, con):
diff --git a/gajim/gtk/service_registration.py b/gajim/gtk/service_registration.py
index 78d161bf2081f5cbd966f5afb9eeefef7092a35e..292708d378c016a1b921778a9a2cc272bddbe02f 100644
--- a/gajim/gtk/service_registration.py
+++ b/gajim/gtk/service_registration.py
@@ -17,13 +17,14 @@
 
 from gi.repository import Gtk
 
-from nbxmpp.modules import dataforms
+from nbxmpp.errors import StanzaError
+from nbxmpp.errors import MalformedStanzaError
+from nbxmpp.errors import RegisterStanzaError
 
 from gajim.common import app
 from gajim.common.i18n import _
 
 from .dataform import DataFormWidget
-from .dataform import FakeDataFormWidget
 
 log = logging.getLogger('gajim.gui.registration')
 
@@ -44,7 +45,6 @@ def __init__(self, account, agent):
         self._agent = agent
         self._account = account
         self._data_form_widget = None
-        self._is_form = None
 
         self.set_application(app.app)
         self.set_resizable(True)
@@ -77,63 +77,55 @@ def _remove_sidebar(self):
         sidebar = main_box.get_children()[0]
         main_box.remove(sidebar)
 
-    def _build_dataform(self, form, is_form):
-        if not is_form:
-            return FakeDataFormWidget(form)
-
-        dataform = dataforms.extend_form(node=form)
-
-        form_widget = DataFormWidget(dataform)
-        form_widget.connect('is-valid', self._on_is_valid)
-        form_widget.validate()
-        return form_widget
-
     def _on_page_change(self, _assistant, _page):
         if self.get_current_page() == Page.REQUEST:
-            self._con.get_module('Register').get_register_form(
-                self._agent, self._on_get_success, self._on_error)
+            self._con.get_module('Register').request_register_form(
+                self._agent, callback=self._on_register_form)
         elif self.get_current_page() == Page.SENDING:
             self._register()
             self.commit()
 
-    def _on_get_success(self, form, is_form):
-        log.info('Show Form page')
-        self._is_form = is_form
-        self._data_form_widget = self._build_dataform(form, is_form)
+    def _on_register_form(self, task):
+        try:
+            result = task.finish()
+        except (StanzaError, MalformedStanzaError) as error:
+            self.get_nth_page(Page.ERROR).set_text(error.get_text())
+            self.set_current_page(Page.ERROR)
+            return
+
+        form = result.form
+        if result.form is None:
+            form = result.fields_form
+
+        self._data_form_widget = DataFormWidget(form)
+        self._data_form_widget.connect('is-valid', self._on_is_valid)
+        self._data_form_widget.validate()
         self.get_nth_page(Page.FORM).set_form(self._data_form_widget)
         self.set_current_page(Page.FORM)
 
     def _on_is_valid(self, _widget, is_valid):
         self.set_page_complete(self.get_nth_page(Page.FORM), is_valid)
 
-    def _on_error(self, error_text, form=None, is_form=False):
-        if form is not None:
-            log.info('Show Form page')
-            self._is_form = is_form
-            self._data_form_widget = self._build_dataform(form, is_form)
-            self.get_nth_page(Page.FORM).set_form(self._data_form_widget,
-                                                  error_text=error_text)
-            self.set_current_page(Page.FORM)
-        else:
-            log.info('Show Error page')
-            self.get_nth_page(Page.ERROR).set_text(error_text)
-            self.set_current_page(Page.ERROR)
-
     def _on_cancel(self, _widget):
         self.destroy()
 
     def _register(self):
-        log.info('Show Sending page')
         form = self._data_form_widget.get_submit_form()
-        self._con.get_module('Register').register_agent(
-            self._agent,
+        self._con.get_module('Register').submit_register_form(
             form,
-            self._is_form,
-            self._on_register_success,
-            self._on_error)
+            self._agent,
+            callback=self._on_register_result)
+
+    def _on_register_result(self, task):
+        try:
+            task.finish()
+        except (StanzaError,
+                MalformedStanzaError,
+                RegisterStanzaError) as error:
+            self.get_nth_page(Page.ERROR).set_text(error.get_text())
+            self.set_current_page(Page.ERROR)
+            return
 
-    def _on_register_success(self):
-        log.info('Show Success page')
         self.set_current_page(Page.SUCCESS)