diff --git a/setup/config/di.config.php b/setup/config/di.config.php
index 9c73aae475358f63c853c9458a6cb67e6796d022..81ddbde7adb1ebf1e17db06ee92852c39338f8e8 100644
--- a/setup/config/di.config.php
+++ b/setup/config/di.config.php
@@ -21,6 +21,7 @@ return [
             'Magento\Setup\Controller\Environment',
             'Magento\Setup\Controller\DependencyCheck',
             'Magento\Setup\Controller\DatabaseCheck',
+            'Magento\Setup\Controller\ValidateAdminCredentials',
             'Magento\Setup\Controller\AddDatabase',
             'Magento\Setup\Controller\WebConfiguration',
             'Magento\Setup\Controller\CustomizeYourStore',
diff --git a/setup/pub/magento/setup/create-admin-account.js b/setup/pub/magento/setup/create-admin-account.js
index ec9fdf9c6b248453ce8aec127ab3677bac6349c7..dd8357dd9a568e4e1aa8b88add9868478f23009e 100644
--- a/setup/pub/magento/setup/create-admin-account.js
+++ b/setup/pub/magento/setup/create-admin-account.js
@@ -5,14 +5,14 @@
 
 'use strict';
 angular.module('create-admin-account', ['ngStorage'])
-    .controller('createAdminAccountController', ['$scope', '$state', '$localStorage', function ($scope, $state, $localStorage) {
+    .controller('createAdminAccountController', ['$scope', '$state', '$localStorage', '$http', function ($scope, $state, $localStorage, $http) {
         $scope.admin = {
             'passwordStatus': {
                 class: 'none',
                 label: 'None'
             }
         };
-        
+
         $scope.passwordStatusChange = function () {
             if (angular.isUndefined($scope.admin.password)) {
                 return;
@@ -41,6 +41,25 @@ angular.module('create-admin-account', ['ngStorage'])
             $scope.admin = $localStorage.admin;
         }
 
+        $scope.validateCredentials = function () {
+            var data = {
+                'db': $localStorage.db,
+                'admin': $localStorage.admin,
+                'store': $localStorage.store,
+                'config': $localStorage.config
+            };
+            $http.post('index.php/validate-admin-credentials', data)
+                .success(function (data) {
+                    $scope.validateCredentials.result = data;
+                    if ($scope.validateCredentials.result.success) {
+                        $scope.nextState();
+                    }
+                })
+                .error(function (data) {
+                    $scope.validateCredentials.failed = data;
+                });
+        };
+
         $scope.$on('nextState', function () {
             $localStorage.admin = $scope.admin;
         });
diff --git a/setup/src/Magento/Setup/Controller/Install.php b/setup/src/Magento/Setup/Controller/Install.php
index 647ba4e59f7d08c734567b997c0a287d92b8fe6f..5b3507911ef4e3cfc2df45e0583b595e207c5c27 100644
--- a/setup/src/Magento/Setup/Controller/Install.php
+++ b/setup/src/Magento/Setup/Controller/Install.php
@@ -6,21 +6,18 @@
 
 namespace Magento\Setup\Controller;
 
-use Magento\Setup\Model\AdminAccount;
+use Magento\Framework\App\DeploymentConfig;
 use Magento\Framework\Config\ConfigOptionsListConstants as SetupConfigOptionsList;
-use Magento\Backend\Setup\ConfigOptionsList as BackendConfigOptionsList;
+use Magento\SampleData;
 use Magento\Setup\Model\Installer;
 use Magento\Setup\Model\Installer\ProgressFactory;
 use Magento\Setup\Model\InstallerFactory;
-use Magento\Setup\Model\StoreConfigurationDataMapper as UserConfig;
+use Magento\Setup\Model\RequestDataConverter;
 use Magento\Setup\Model\WebLogger;
 use Zend\Json\Json;
 use Zend\Mvc\Controller\AbstractActionController;
 use Zend\View\Model\JsonModel;
 use Zend\View\Model\ViewModel;
-use Magento\Setup\Console\Command\InstallCommand;
-use Magento\SampleData;
-use Magento\Framework\App\DeploymentConfig;
 
 /**
  * Install controller
@@ -54,6 +51,11 @@ class Install extends AbstractActionController
      */
     private $deploymentConfig;
 
+    /**
+     * @var RequestDataConverter
+     */
+    private $requestDataConverter;
+
     /**
      * Default Constructor
      *
@@ -62,19 +64,22 @@ class Install extends AbstractActionController
      * @param ProgressFactory $progressFactory
      * @param \Magento\Framework\Setup\SampleData\State $sampleDataState
      * @param \Magento\Framework\App\DeploymentConfig $deploymentConfig
+     * @param RequestDataConverter $requestDataConverter
      */
     public function __construct(
         WebLogger $logger,
         InstallerFactory $installerFactory,
         ProgressFactory $progressFactory,
         \Magento\Framework\Setup\SampleData\State $sampleDataState,
-        DeploymentConfig $deploymentConfig
+        DeploymentConfig $deploymentConfig,
+        RequestDataConverter $requestDataConverter
     ) {
         $this->log = $logger;
         $this->installer = $installerFactory->create($logger);
         $this->progressFactory = $progressFactory;
         $this->sampleDataState = $sampleDataState;
         $this->deploymentConfig = $deploymentConfig;
+        $this->requestDataConverter = $requestDataConverter;
     }
 
     /**
@@ -91,7 +96,6 @@ class Install extends AbstractActionController
      * Index Action
      *
      * @return JsonModel
-     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     public function startAction()
     {
@@ -99,11 +103,9 @@ class Install extends AbstractActionController
         $json = new JsonModel;
         try {
             $this->checkForPriorInstall();
-            $data = array_merge(
-                $this->importDeploymentConfigForm(),
-                $this->importUserConfigForm(),
-                $this->importAdminUserForm()
-            );
+            $content = $this->getRequest()->getContent();
+            $source = $content ? $source = Json::decode($content, Json::TYPE_ARRAY) : [];
+            $data = $this->requestDataConverter->convert($source);
             $this->installer->install($data);
             $json->setVariable(
                 'key',
@@ -168,102 +170,4 @@ class Install extends AbstractActionController
             throw new \Magento\Setup\Exception('Magento application is already installed.');
         }
     }
-
-    /**
-     * Maps data from request to format of deployment config model
-     *
-     * @return array
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    private function importDeploymentConfigForm()
-    {
-        $content = $this->getRequest()->getContent();
-        $source = [];
-        if ($content) {
-            $source = Json::decode($content, Json::TYPE_ARRAY);
-        }
-
-        $result = [];
-        $result[SetupConfigOptionsList::INPUT_KEY_DB_HOST] = isset($source['db']['host']) ? $source['db']['host'] : '';
-        $result[SetupConfigOptionsList::INPUT_KEY_DB_NAME] = isset($source['db']['name']) ? $source['db']['name'] : '';
-        $result[SetupConfigOptionsList::INPUT_KEY_DB_USER] = isset($source['db']['user']) ? $source['db']['user'] :'';
-        $result[SetupConfigOptionsList::INPUT_KEY_DB_PASSWORD] =
-            isset($source['db']['password']) ? $source['db']['password'] : '';
-        $result[SetupConfigOptionsList::INPUT_KEY_DB_PREFIX] =
-            isset($source['db']['tablePrefix']) ? $source['db']['tablePrefix'] : '';
-        $result[BackendConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME] = isset($source['config']['address']['admin'])
-            ? $source['config']['address']['admin'] : '';
-        $result[SetupConfigOptionsList::INPUT_KEY_ENCRYPTION_KEY] = isset($source['config']['encrypt']['key'])
-            ? $source['config']['encrypt']['key'] : null;
-        $result[SetupConfigOptionsList::INPUT_KEY_SESSION_SAVE] = isset($source['config']['sessionSave']['type'])
-            ? $source['config']['sessionSave']['type'] : SetupConfigOptionsList::SESSION_SAVE_FILES;
-        $result[Installer::ENABLE_MODULES] = isset($source['store']['selectedModules'])
-            ? implode(',', $source['store']['selectedModules']) : '';
-        $result[Installer::DISABLE_MODULES] = isset($source['store']['allModules'])
-            ? implode(',', array_diff($source['store']['allModules'], $source['store']['selectedModules'])) : '';
-        return $result;
-    }
-
-    /**
-     * Maps data from request to format of user config model
-     *
-     * @return array
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    private function importUserConfigForm()
-    {
-        $result = [];
-        $source = [];
-        $content = $this->getRequest()->getContent();
-        if ($content) {
-            $source = Json::decode($content, Json::TYPE_ARRAY);
-        }
-        if (isset($source['config']['address']['base_url']) && !empty($source['config']['address']['base_url'])) {
-            $result[UserConfig::KEY_BASE_URL] = $source['config']['address']['base_url'];
-        }
-        $result[UserConfig::KEY_USE_SEF_URL] = isset($source['config']['rewrites']['allowed'])
-            ? $source['config']['rewrites']['allowed'] : '';
-        $result[UserConfig::KEY_IS_SECURE] = isset($source['config']['https']['front'])
-            ? $source['config']['https']['front'] : '';
-        $result[UserConfig::KEY_IS_SECURE_ADMIN] = isset($source['config']['https']['admin'])
-            ? $source['config']['https']['admin'] : '';
-        $result[UserConfig::KEY_BASE_URL_SECURE] = (isset($source['config']['https']['front'])
-            || isset($source['config']['https']['admin']))
-            ? $source['config']['https']['text'] : '';
-        $result[UserConfig::KEY_LANGUAGE] = isset($source['store']['language'])
-            ? $source['store']['language'] : '';
-        $result[UserConfig::KEY_TIMEZONE] = isset($source['store']['timezone'])
-            ? $source['store']['timezone'] : '';
-        $result[UserConfig::KEY_CURRENCY] = isset($source['store']['currency'])
-            ? $source['store']['currency'] : '';
-        $result[InstallCommand::INPUT_KEY_USE_SAMPLE_DATA] = isset($source['store']['useSampleData'])
-            ? $source['store']['useSampleData'] : '';
-        $result[InstallCommand::INPUT_KEY_CLEANUP_DB] = isset($source['store']['cleanUpDatabase'])
-            ? $source['store']['cleanUpDatabase'] : '';
-        return $result;
-    }
-
-    /**
-     * Maps data from request to format of admin account model
-     *
-     * @return array
-     * @SuppressWarnings(PHPMD.NPathComplexity)
-     */
-    private function importAdminUserForm()
-    {
-        $result = [];
-        $source = [];
-        $content = $this->getRequest()->getContent();
-        if ($content) {
-            $source = Json::decode($content, Json::TYPE_ARRAY);
-        }
-        $result[AdminAccount::KEY_USER] = isset($source['admin']['username']) ? $source['admin']['username'] : '';
-        $result[AdminAccount::KEY_PASSWORD] = isset($source['admin']['password']) ? $source['admin']['password'] : '';
-        $result[AdminAccount::KEY_EMAIL] = isset($source['admin']['email']) ? $source['admin']['email'] : '';
-        $result[AdminAccount::KEY_FIRST_NAME] = $result[AdminAccount::KEY_USER];
-        $result[AdminAccount::KEY_LAST_NAME] = $result[AdminAccount::KEY_USER];
-        return $result;
-    }
 }
diff --git a/setup/src/Magento/Setup/Controller/ValidateAdminCredentials.php b/setup/src/Magento/Setup/Controller/ValidateAdminCredentials.php
new file mode 100644
index 0000000000000000000000000000000000000000..6833c1fba0c113c2a503e252fad610b1091a0407
--- /dev/null
+++ b/setup/src/Magento/Setup/Controller/ValidateAdminCredentials.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Setup\Controller;
+
+use Magento\Setup\Model\Installer;
+use Magento\Setup\Model\RequestDataConverter;
+use Magento\Setup\Validator\AdminCredentialsValidator;
+use Zend\Json\Json;
+use Zend\Mvc\Controller\AbstractActionController;
+use Zend\View\Model\JsonModel;
+
+/**
+ * Controller for admin credentials validation
+ */
+class ValidateAdminCredentials extends AbstractActionController
+{
+    /**
+     * @var AdminCredentialsValidator
+     */
+    private $adminCredentialsValidator;
+
+    /**
+     * @var RequestDataConverter
+     */
+    private $requestDataConverter;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param AdminCredentialsValidator $adminCredentialsValidator
+     * @param RequestDataConverter $requestDataConverter
+     */
+    public function __construct(
+        AdminCredentialsValidator $adminCredentialsValidator,
+        RequestDataConverter $requestDataConverter
+    ) {
+        $this->adminCredentialsValidator = $adminCredentialsValidator;
+        $this->requestDataConverter = $requestDataConverter;
+    }
+
+    /**
+     * Validate admin credentials.
+     *
+     * @return JsonModel
+     */
+    public function indexAction()
+    {
+        try {
+            $content = $this->getRequest()->getContent();
+            $source = $content ? $source = Json::decode($content, Json::TYPE_ARRAY) : [];
+            $data = $this->requestDataConverter->convert($source);
+            $this->adminCredentialsValidator->validate($data);
+            return new JsonModel(['success' => true]);
+        } catch (\Exception $e) {
+            return new JsonModel(['success' => false, 'error' => $e->getMessage()]);
+        }
+    }
+}
diff --git a/setup/src/Magento/Setup/Model/AdminAccount.php b/setup/src/Magento/Setup/Model/AdminAccount.php
index cd9362f8a0d47fc90574256fbbf955211b6d19e3..6605052cede1e88e4009dbf08349b5845e60e660 100644
--- a/setup/src/Magento/Setup/Model/AdminAccount.php
+++ b/setup/src/Magento/Setup/Model/AdminAccount.php
@@ -137,22 +137,22 @@ class AdminAccount
      * @return void
      * @throws \Exception If the username and email do not both match data provided to install
      */
-    private function validateUserMatches($username, $email)
+    public function validateUserMatches($username, $email)
     {
         if ((strcasecmp($email, $this->data[self::KEY_EMAIL]) == 0) &&
             (strcasecmp($username, $this->data[self::KEY_USER]) != 0)) {
             // email matched but username did not
             throw new \Exception(
-                'An existing user has the given email but different username. ' . self::KEY_USER .
-                ' and ' . self::KEY_EMAIL . ' both need to match an existing user or both be new.'
+                'An existing user has the given email but different username. '
+                . 'Username and email both need to match an existing user or both be new.'
             );
         }
         if ((strcasecmp($username, $this->data[self::KEY_USER]) == 0) &&
             (strcasecmp($email, $this->data[self::KEY_EMAIL]) != 0)) {
             // username matched but email did not
             throw new \Exception(
-                'An existing user has the given username but different email. ' . self::KEY_USER .
-                ' and ' . self::KEY_EMAIL . ' both need to match an existing user or both be new.'
+                'An existing user has the given username but different email. '
+                . 'Username and email both need to match an existing user or both be new.'
             );
         }
     }
diff --git a/setup/src/Magento/Setup/Model/RequestDataConverter.php b/setup/src/Magento/Setup/Model/RequestDataConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd924c16f3da08b1d7353c0e56659173ec9d2eac
--- /dev/null
+++ b/setup/src/Magento/Setup/Model/RequestDataConverter.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Setup\Model;
+
+use Magento\Framework\Config\ConfigOptionsListConstants as SetupConfigOptionsList;
+use Magento\Backend\Setup\ConfigOptionsList as BackendConfigOptionsList;
+use Magento\Setup\Model\StoreConfigurationDataMapper as UserConfig;
+use Magento\Setup\Console\Command\InstallCommand;
+
+/**
+ * Converter of request data into format compatible with models.
+ */
+class RequestDataConverter
+{
+    /**
+     * Convert request data into format compatible with models.
+     *
+     * @param array $source
+     * @return array
+     */
+    public function convert(array $source)
+    {
+        $result = array_merge(
+            $this->convertDeploymentConfigForm($source),
+            $this->convertUserConfigForm($source),
+            $this->convertAdminUserForm($source)
+        );
+        return $result;
+    }
+
+    /**
+     * Convert data from request to format of deployment config model
+     *
+     * @param array $source
+     * @return array
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     */
+    private function convertDeploymentConfigForm(array $source)
+    {
+        $result = [];
+        $result[SetupConfigOptionsList::INPUT_KEY_DB_HOST] = isset($source['db']['host']) ? $source['db']['host'] : '';
+        $result[SetupConfigOptionsList::INPUT_KEY_DB_NAME] = isset($source['db']['name']) ? $source['db']['name'] : '';
+        $result[SetupConfigOptionsList::INPUT_KEY_DB_USER] = isset($source['db']['user']) ? $source['db']['user'] : '';
+        $result[SetupConfigOptionsList::INPUT_KEY_DB_PASSWORD] =
+            isset($source['db']['password']) ? $source['db']['password'] : '';
+        $result[SetupConfigOptionsList::INPUT_KEY_DB_PREFIX] =
+            isset($source['db']['tablePrefix']) ? $source['db']['tablePrefix'] : '';
+        $result[BackendConfigOptionsList::INPUT_KEY_BACKEND_FRONTNAME] = isset($source['config']['address']['admin'])
+            ? $source['config']['address']['admin'] : '';
+        $result[SetupConfigOptionsList::INPUT_KEY_ENCRYPTION_KEY] = isset($source['config']['encrypt']['key'])
+            ? $source['config']['encrypt']['key'] : null;
+        $result[SetupConfigOptionsList::INPUT_KEY_SESSION_SAVE] = isset($source['config']['sessionSave']['type'])
+            ? $source['config']['sessionSave']['type'] : SetupConfigOptionsList::SESSION_SAVE_FILES;
+        $result[Installer::ENABLE_MODULES] = isset($source['store']['selectedModules'])
+            ? implode(',', $source['store']['selectedModules']) : '';
+        $result[Installer::DISABLE_MODULES] = isset($source['store']['allModules'])
+            ? implode(',', array_diff($source['store']['allModules'], $source['store']['selectedModules'])) : '';
+        return $result;
+    }
+
+    /**
+     * Convert data from request to format of user config model
+     *
+     * @param array $source
+     * @return array
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     */
+    private function convertUserConfigForm(array $source)
+    {
+        $result = [];
+        if (isset($source['config']['address']['base_url']) && !empty($source['config']['address']['base_url'])) {
+            $result[UserConfig::KEY_BASE_URL] = $source['config']['address']['base_url'];
+        }
+        $result[UserConfig::KEY_USE_SEF_URL] = isset($source['config']['rewrites']['allowed'])
+            ? $source['config']['rewrites']['allowed'] : '';
+        $result[UserConfig::KEY_IS_SECURE] = isset($source['config']['https']['front'])
+            ? $source['config']['https']['front'] : '';
+        $result[UserConfig::KEY_IS_SECURE_ADMIN] = isset($source['config']['https']['admin'])
+            ? $source['config']['https']['admin'] : '';
+        $result[UserConfig::KEY_BASE_URL_SECURE] = (isset($source['config']['https']['front'])
+            || isset($source['config']['https']['admin']))
+            ? $source['config']['https']['text'] : '';
+        $result[UserConfig::KEY_LANGUAGE] = isset($source['store']['language'])
+            ? $source['store']['language'] : '';
+        $result[UserConfig::KEY_TIMEZONE] = isset($source['store']['timezone'])
+            ? $source['store']['timezone'] : '';
+        $result[UserConfig::KEY_CURRENCY] = isset($source['store']['currency'])
+            ? $source['store']['currency'] : '';
+        $result[InstallCommand::INPUT_KEY_USE_SAMPLE_DATA] = isset($source['store']['useSampleData'])
+            ? $source['store']['useSampleData'] : '';
+        $result[InstallCommand::INPUT_KEY_CLEANUP_DB] = isset($source['store']['cleanUpDatabase'])
+            ? $source['store']['cleanUpDatabase'] : '';
+        return $result;
+    }
+
+    /**
+     * Convert data from request to format of admin account model
+     *
+     * @param array $source
+     * @return array
+     */
+    private function convertAdminUserForm(array $source)
+    {
+        $result = [];
+        $result[AdminAccount::KEY_USER] = isset($source['admin']['username']) ? $source['admin']['username'] : '';
+        $result[AdminAccount::KEY_PASSWORD] = isset($source['admin']['password']) ? $source['admin']['password'] : '';
+        $result[AdminAccount::KEY_EMAIL] = isset($source['admin']['email']) ? $source['admin']['email'] : '';
+        $result[AdminAccount::KEY_FIRST_NAME] = $result[AdminAccount::KEY_USER];
+        $result[AdminAccount::KEY_LAST_NAME] = $result[AdminAccount::KEY_USER];
+        return $result;
+    }
+}
diff --git a/setup/src/Magento/Setup/Test/Unit/Controller/InstallTest.php b/setup/src/Magento/Setup/Test/Unit/Controller/InstallTest.php
index 121621075a138ff1fd0e91588606315b5f378df1..55666ffef059c1b4b89e23acc92e2426840a895e 100644
--- a/setup/src/Magento/Setup/Test/Unit/Controller/InstallTest.php
+++ b/setup/src/Magento/Setup/Test/Unit/Controller/InstallTest.php
@@ -7,6 +7,7 @@
 namespace Magento\Setup\Test\Unit\Controller;
 
 use \Magento\Setup\Controller\Install;
+use Magento\Setup\Model\RequestDataConverter;
 
 class InstallTest extends \PHPUnit_Framework_TestCase
 {
@@ -25,6 +26,11 @@ class InstallTest extends \PHPUnit_Framework_TestCase
      */
     private $progressFactory;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|RequestDataConverter
+     */
+    private $requestDataConverter;
+
     /**
      * @var Install
      */
@@ -48,6 +54,7 @@ class InstallTest extends \PHPUnit_Framework_TestCase
         $this->progressFactory = $this->getMock('\Magento\Setup\Model\Installer\ProgressFactory', [], [], '', false);
         $this->sampleDataState = $this->getMock('\Magento\Framework\Setup\SampleData\State', [], [], '', false);
         $this->deploymentConfig = $this->getMock('\Magento\Framework\App\DeploymentConfig', [], [], '', false);
+        $this->requestDataConverter = $this->getMock(RequestDataConverter::class, [], [], '', false);
 
         $installerFactory->expects($this->once())->method('create')->with($this->webLogger)
             ->willReturn($this->installer);
@@ -56,7 +63,8 @@ class InstallTest extends \PHPUnit_Framework_TestCase
             $installerFactory,
             $this->progressFactory,
             $this->sampleDataState,
-            $this->deploymentConfig
+            $this->deploymentConfig,
+            $this->requestDataConverter
         );
     }
 
diff --git a/setup/src/Magento/Setup/Validator/AdminCredentialsValidator.php b/setup/src/Magento/Setup/Validator/AdminCredentialsValidator.php
new file mode 100644
index 0000000000000000000000000000000000000000..b487e11a63fe191c185f5d35531addcb81e8e720
--- /dev/null
+++ b/setup/src/Magento/Setup/Validator/AdminCredentialsValidator.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Setup\Validator;
+
+use Magento\Framework\Config\ConfigOptionsListConstants as ConfigOption;
+use Magento\Setup\Model\AdminAccount;
+use Magento\Setup\Model\Installer;
+
+/**
+ * Admin user credentials validator
+ */
+class AdminCredentialsValidator
+{
+    /**
+     * @var \Magento\Setup\Module\ConnectionFactory
+     */
+    private $connectionFactory;
+
+    /**
+     * @var \Magento\Setup\Model\AdminAccountFactory
+     */
+    private $adminAccountFactory;
+
+    /**
+     * @var \Magento\Setup\Module\SetupFactory
+     */
+    private $setupFactory;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param \Magento\Setup\Model\AdminAccountFactory $adminAccountFactory
+     * @param \Magento\Setup\Module\ConnectionFactory $connectionFactory
+     * @param \Magento\Setup\Module\SetupFactory $setupFactory
+     */
+    public function __construct(
+        \Magento\Setup\Model\AdminAccountFactory $adminAccountFactory,
+        \Magento\Setup\Module\ConnectionFactory $connectionFactory,
+        \Magento\Setup\Module\SetupFactory $setupFactory
+    ) {
+        $this->connectionFactory = $connectionFactory;
+        $this->adminAccountFactory = $adminAccountFactory;
+        $this->setupFactory = $setupFactory;
+    }
+
+    /**
+     * Validate admin user name and email.
+     *
+     * @param array $data
+     * @return void
+     * @throws \Exception
+     */
+    public function validate(array $data)
+    {
+        try {
+            $dbConnection = $this->connectionFactory->create([
+                ConfigOption::KEY_NAME => $data[ConfigOption::INPUT_KEY_DB_NAME],
+                ConfigOption::KEY_HOST => $data[ConfigOption::INPUT_KEY_DB_HOST],
+                ConfigOption::KEY_USER => $data[ConfigOption::INPUT_KEY_DB_USER],
+                ConfigOption::KEY_PASSWORD => $data[ConfigOption::INPUT_KEY_DB_PASSWORD],
+                ConfigOption::KEY_PREFIX => $data[ConfigOption::INPUT_KEY_DB_PREFIX]
+            ]);
+
+            $userName = $data[AdminAccount::KEY_USER];
+            $userEmail = $data[AdminAccount::KEY_EMAIL];
+            $userTable = $dbConnection->getTableName('admin_user');
+            $result = $dbConnection->fetchRow(
+                "SELECT user_id, username, email FROM {$userTable} WHERE username = :username OR email = :email",
+                ['username' => $userName, 'email' => $userEmail]
+            );
+            $setup = $this->setupFactory->create();
+            $adminAccount = $this->adminAccountFactory->create(
+                $setup,
+                [AdminAccount::KEY_USER => $userName, AdminAccount::KEY_EMAIL => $userEmail]
+            );
+        } catch (\Exception $e) {
+            return;
+        }
+
+        if (!empty($result)) {
+            $adminAccount->validateUserMatches($result['username'], $result['email']);
+        }
+    }
+}
diff --git a/setup/view/magento/setup/create-admin-account.phtml b/setup/view/magento/setup/create-admin-account.phtml
index 8c08d127aac656c68c5511a53da8d708529b1277..35c0c911b184cf9e3759eba4e9032cedd73216ff 100644
--- a/setup/view/magento/setup/create-admin-account.phtml
+++ b/setup/view/magento/setup/create-admin-account.phtml
@@ -29,7 +29,7 @@ $passwordWizard = sprintf(
             <button
                 type="button"
                 class="btn btn-prime"
-                ng-click="nextState()"
+                ng-click="validateCredentials()"
                 ng-disabled="account.$invalid && account.submitted"
                 >Next</button>
         </div>
@@ -41,6 +41,25 @@ $passwordWizard = sprintf(
 
 <h2 class="page-sub-title">{{$state.current.header}}</h2>
 
+<div
+    class="message message-success"
+    ng-show="validateCredentials.result.success && validateCredentials.pressed"
+>
+    <span class="message-text">Credentials validation successfully passed.</span>
+</div>
+<div
+    class="message message-error"
+    ng-show="validateCredentials.result.success === false && validateCredentials.result !== undefined"
+>
+    <span class="message-text">{{validateCredentials.result.error}}</span>
+</div>
+<div
+    class="message message-error"
+    ng-show="validateCredentials.failed !== undefined"
+>
+    <span class="message-text">{{validateCredentials.failed}}</span>
+</div>
+
 <p>
     Create a new Admin account to manage your store.
 </p>