diff --git a/modules/tupas_registration/src/Form/RegisterForm.php b/modules/tupas_registration/src/Form/RegisterForm.php
index 659ae27..4e9e589 100644
--- a/modules/tupas_registration/src/Form/RegisterForm.php
+++ b/modules/tupas_registration/src/Form/RegisterForm.php
@@ -97,17 +97,24 @@ class RegisterForm extends AccountForm {
    * {@inheritdoc}
    */
   public function save(array $form, FormStateInterface $form_state) {
-    if ($account = $this->sessionManager->loginRegister($this->auth)) {
-      drupal_set_message($this->t('Registration successful. You are now logged in.'));
+    /** @var \Drupal\user\UserInterface $entity */
+    $entity = $this->entity;
+    // Force account to be active.
+    $entity->set('status', TRUE);
+
+    parent::save($form, $form_state);
+
+    // Map tupas session to existing account after a succesful registration.
+    if ($account = $this->sessionManager->linkExisting($this->auth, $entity)) {
+      $this->sessionManager->login($this->auth);
 
-      // Save user details.
-      $account->setUsername($form_state->getValue('name'))
-        ->setEmail($form_state->getValue('mail'))
-        ->setPassword(user_password(20));
-      $account->save();
+      drupal_set_message($this->t('Registration successful. You are now logged in.'));
     }
     else {
-      drupal_set_message($this->t('Registration failed due to an unknown reason.'));
+      // Delete account if registration failed.
+      $entity->delete();
+
+      drupal_set_message($this->t('Registration failed due to an unknown reason.'), 'error');
     }
     $form_state->setRedirect('<front>');
   }
diff --git a/modules/tupas_session/src/TupasSessionManager.php b/modules/tupas_session/src/TupasSessionManager.php
index 3d67c4d..9a30210 100644
--- a/modules/tupas_session/src/TupasSessionManager.php
+++ b/modules/tupas_session/src/TupasSessionManager.php
@@ -3,10 +3,12 @@
 namespace Drupal\tupas_session;
 
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Session\SessionManagerInterface;
 use Drupal\externalauth\ExternalAuthInterface;
 use Drupal\tupas_session\Event\SessionData;
 use Drupal\tupas_session\Event\SessionEvents;
+use Drupal\user\UserInterface;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\HttpFoundation\Session\Session;
 
@@ -162,12 +164,25 @@ class TupasSessionManager implements TupasSessionManagerInterface {
   /**
    * {@inheritdoc}
    */
-  public function loginRegister(ExternalAuthInterface $auth) {
+  public function linkExisting(ExternalAuthInterface $auth, UserInterface $account) {
+    if (!$session = $this->getSession()) {
+      return FALSE;
+    }
+    $auth->linkExistingAccount($session->getUniqueId(), 'tupas_registration', $account);
+    $this->recreate($session);
+
+    return $account;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function loginRegister(ExternalAuthInterface $auth, array $data = []) {
     if (!$session = $this->getSession()) {
       return FALSE;
     }
     // Login before migrating session over.
-    if (!$account = $auth->loginRegister($session->getUniqueId(), 'tupas_registration')) {
+    if (!$account = $auth->loginRegister($session->getUniqueId(), 'tupas_registration', $data)) {
       return FALSE;
     }
     $this->recreate($session);
diff --git a/modules/tupas_session/src/TupasSessionManagerInterface.php b/modules/tupas_session/src/TupasSessionManagerInterface.php
index e7cdc3b..6de56a2 100644
--- a/modules/tupas_session/src/TupasSessionManagerInterface.php
+++ b/modules/tupas_session/src/TupasSessionManagerInterface.php
@@ -4,6 +4,7 @@ namespace Drupal\tupas_session;
 
 use Drupal\externalauth\ExternalAuthInterface;
 use Drupal\tupas_session\Event\SessionData;
+use Drupal\user\UserInterface;
 
 /**
  * Interface TupasSessionManagerInterface.
@@ -44,6 +45,23 @@ interface TupasSessionManagerInterface {
    *
    * @param \Drupal\externalauth\ExternalAuthInterface $auth
    *   The external auth service.
+   * @param \Drupal\user\UserInterface $account
+   *   The user account entity.
+   *
+   * @return \Drupal\user\UserInterface|bool
+   *   The logged in Drupal user.
+   */
+  public function linkExisting(ExternalAuthInterface $auth, UserInterface $account);
+
+  /**
+   * Login wrapper to migrate session over to newly logged in user.
+   *
+   * Note: the ExternalAuthInterface is injected to the function
+   * because we don't want to create a hard dependency to Tupas registration
+   * module.
+   *
+   * @param \Drupal\externalauth\ExternalAuthInterface $auth
+   *   The external auth service.
    *
    * @return \Drupal\user\UserInterface|bool
    *   The logged in Drupal user.
@@ -59,11 +77,13 @@ interface TupasSessionManagerInterface {
    *
    * @param \Drupal\externalauth\ExternalAuthInterface $auth
    *   The external auth service.
+   * @param array $data
+   *   An additional account data.
    *
-   * @return \Drupal\user\UserInterface|bool
+   * @return bool|\Drupal\user\UserInterface
    *   The logged in Drupal user.
    */
-  public function loginRegister(ExternalAuthInterface $auth);
+  public function loginRegister(ExternalAuthInterface $auth, array $data = []);
 
   /**
    * Recreate session with previous session object.
