diff --git a/dev/tests/functional/phpunit.xml.dist b/dev/tests/functional/phpunit.xml.dist
index f5f293ffa39f5099974a754655166834d26eb9a2..4eeeaccb436bd87192b6ec0634b3397985674e84 100644
--- a/dev/tests/functional/phpunit.xml.dist
+++ b/dev/tests/functional/phpunit.xml.dist
@@ -35,7 +35,7 @@
         <env name="testsuite_rule_path" value="Magento/Mtf/TestSuite/InjectableTests" />
         <env name="log_directory" value="var/log" />
         <env name="events_preset" value="base" />
-        <env name="module_whitelist" value="Magento_Install" />
+        <env name="module_whitelist" value="Magento_Install,Magento_Upgrade" />
         <env name="basedir" value="var/log" />
         <env name="credentials_file_path" value="./credentials.xml.dist" />
         <env name="mage_mode" value="developer" />
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Version.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Version.php
new file mode 100644
index 0000000000000000000000000000000000000000..a947cc6bfc5aac91bf535fb1789a96cbf39865ef
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Version.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Backend\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+class Version extends Block
+{
+    /**
+     * @var string
+     */
+    protected $backendVersion = 'magento-version';
+
+    /**
+     * Returns dashboard application version
+     *
+     * @return string
+     */
+    public function getVersion()
+    {
+        return $this->_rootElement->find($this->backendVersion, Locator::SELECTOR_CLASS_NAME)->getText();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/Dashboard.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/Dashboard.xml
index cd846dd75323040300dbfcb94b91e37bc66a8f30..9b666cc8a72aeae67e906f176f9cb623b475ce85 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/Dashboard.xml
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Page/Adminhtml/Dashboard.xml
@@ -15,5 +15,6 @@
         <block name="errorBlock" class="Magento\Backend\Test\Block\Page\Error" locator="[id='page:main-container']" strategy="css selector" />
         <block name="accessDeniedBlock" class="Magento\Backend\Test\Block\Denied" locator="#anchor-content" strategy="css selector" />
         <block name="systemMessageDialog" class="Magento\AdminNotification\Test\Block\System\Messages" locator='[role="dialog"].ui-popup-message' strategy="css selector" />
+        <block name="applicationVersion" class="Magento\Backend\Test\Block\Version" locator="body" strategy="css selector" />
     </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2df872d068d35d474a7e1e33d18fe72865a717a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Element\SimpleElement;
+use Magento\Mtf\Client\Locator;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Perform Authentication block.
+ */
+class Authentication extends Form
+{
+    /**
+     * 'Save Config' button.
+     *
+     * @var string
+     */
+    protected $save = "[ng-click*='saveAuthJson']";
+
+    /**
+     * First field selector
+     *
+     * @var string
+     */
+    protected $firstField = '[name="username"]';
+
+    /**
+     * Click on 'Save Config' button.
+     *
+     * @return void
+     */
+    public function clickSaveConfig()
+    {
+        $this->_rootElement->find($this->save, Locator::SELECTOR_CSS)->click();
+    }
+
+    /**
+     * Ensure the form is loaded and fill the root form
+     *
+     * @param FixtureInterface $fixture
+     * @param SimpleElement|null $element
+     * @return $this
+     */
+    public function fill(FixtureInterface $fixture, SimpleElement $element = null)
+    {
+        $this->waitForElementVisible($this->firstField);
+        return parent::fill($fixture, $element);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3958a86df320f19803a68a82ee3323a1283586cc
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Authentication.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<mapping strict="1">
+    <fields>
+        <publicKey>
+            <selector>[name='username']</selector>
+        </publicKey>
+        <privateKey>
+            <selector>[name='password']</selector>
+        </privateKey>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.php
new file mode 100644
index 0000000000000000000000000000000000000000..153acde0b9a299165c75eb5e3f0fb4c81a61f5a9
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Element\SimpleElement;
+use Magento\Mtf\Client\Locator;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Create Backup block.
+ */
+class CreateBackup extends Form
+{
+    /**
+     * 'Start Update' button.
+     *
+     * @var string
+     */
+    protected $startUpdate = "[ng-click*='goToStartUpdater']";
+
+    /**
+     * Click on 'Start Update/Next' button.
+     *
+     * @return void
+     */
+    public function clickNext()
+    {
+        $this->_rootElement->find($this->startUpdate, Locator::SELECTOR_CSS)->click();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6085acc0a158abe83b56aa25f6014f1b38007e48
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/CreateBackup.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<mapping strict="0">
+    <fields>
+        <optionsCode>
+            <selector>#optionsCode</selector>
+            <input>checkbox</input>
+        </optionsCode>
+        <optionsMedia>
+            <selector>#optionsMedia</selector>
+            <input>checkbox</input>
+        </optionsMedia>
+        <optionsDb>
+            <selector>#optionsDb</selector>
+            <input>checkbox</input>
+        </optionsDb>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Home.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Home.php
new file mode 100644
index 0000000000000000000000000000000000000000..d6ed4095f6591a32e2e2cbdf983b8ccb76fb4edc
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Home.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * Home block.
+ */
+class Home extends Block
+{
+    /**
+     * @var string
+     */
+    protected $systemUpgrade = '.setup-home-item-upgrade';
+
+    /**
+     * Click on 'System Upgrade' button.
+     *
+     * @return void
+     */
+    public function clickSystemUpgrade()
+    {
+        $this->_rootElement->find($this->systemUpgrade, Locator::SELECTOR_CSS)->click();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Readiness.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Readiness.php
new file mode 100644
index 0000000000000000000000000000000000000000..28890268f8534e5c6e1d522d1dafde4266d80603
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/Readiness.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * Readiness block.
+ */
+class Readiness extends Block
+{
+    /**
+     * 'Start Readiness Check' button.
+     *
+     * @var string
+     */
+    protected $readinessCheck = "[ng-click*='state.go']";
+
+    /**
+     * 'Next' button.
+     *
+     * @var string
+     */
+    protected $next = "[ng-click*='next']";
+
+    /**
+     * 'Completed!' message.
+     * [ng-switch-when="true"]
+     * @var string
+     */
+    protected $completedMessage = '[ng-switch-when="true"]';
+
+    /**
+     * Updater application successful check.
+     *
+     * @var string
+     */
+    protected $updaterApplicationCheck = '#updater-application';
+
+    /**
+     * Cron script successful check.
+     *
+     * @var string
+     */
+    protected $cronScriptCheck = '#cron-script';
+
+    /**
+     * Dependency successful check.
+     *
+     * @var string
+     */
+    protected $dependencyCheck = '#component-dependency';
+
+    /**
+     * PHP Version successful check.
+     *
+     * @var string
+     */
+    protected $phpVersionCheck = '#php-version';
+
+    /**
+     * PHP Settings successful check.
+     *
+     * @var string
+     */
+    protected $phpSettingsCheck = '#php-settings';
+
+    /**
+     * PHP Extensions successful check.
+     *
+     * @var string
+     */
+    protected $phpExtensionCheck = '#php-extensions';
+
+    /**
+     * Click on 'Start Readiness Check' button.
+     *
+     * @return void
+     */
+    public function clickReadinessCheck()
+    {
+        $this->_rootElement->find($this->readinessCheck, Locator::SELECTOR_CSS)->click();
+        $this->waitForElementVisible($this->completedMessage, Locator::SELECTOR_CSS);
+    }
+
+    /**
+     * Click on 'Next' button.
+     *
+     * @return void
+     */
+    public function clickNext()
+    {
+        $this->_rootElement->find($this->next, Locator::SELECTOR_CSS)->click();
+    }
+
+    /**
+     * Get Updater application check result.
+     *
+     * @return string
+     */
+    public function getUpdaterApplicationCheck()
+    {
+        return $this->_rootElement->find($this->updaterApplicationCheck, Locator::SELECTOR_CSS)->getText();
+    }
+
+    /**
+     * Get cron script check result.
+     *
+     * @return string
+     */
+    public function getCronScriptCheck()
+    {
+        return $this->_rootElement->find($this->cronScriptCheck, Locator::SELECTOR_CSS)->getText();
+    }
+
+    /**
+     * Get dependency check result.
+     *
+     * @return string
+     */
+    public function getDependencyCheck()
+    {
+        return $this->_rootElement->find($this->dependencyCheck, Locator::SELECTOR_CSS)->getText();
+    }
+
+    /**
+     * Get PHP Version check result.
+     *
+     * @return string
+     */
+    public function getPhpVersionCheck()
+    {
+        return $this->_rootElement->find($this->phpVersionCheck, Locator::SELECTOR_CSS)->getText();
+    }
+
+    /**
+     * Get setting check result.
+     *
+     * @return string
+     */
+    public function getSettingsCheck()
+    {
+        return $this->_rootElement->find($this->phpSettingsCheck, Locator::SELECTOR_CSS)->getText();
+    }
+
+    /**
+     * Get PHP Extensions check result.
+     *
+     * @return string
+     */
+    public function getPhpExtensionsCheck()
+    {
+        return $this->_rootElement->find($this->phpExtensionCheck, Locator::SELECTOR_CSS)->getText();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.php
new file mode 100644
index 0000000000000000000000000000000000000000..9322b3dcb33c6ca156027ad424a5b344888624b2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Form;
+use Magento\Mtf\Client\Element\SimpleElement;
+use Magento\Mtf\Client\Locator;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Select version block.
+ */
+class SelectVersion extends Form
+{
+    /**
+     * 'Next' button.
+     *
+     * @var string
+     */
+    protected $next = "[ng-click*='update']";
+
+    /**
+     * First field selector
+     *
+     * @var string
+     */
+    protected $firstField = '#selectVersion';
+
+    /**
+     * Click on 'Next' button.
+     *
+     * @return void
+     */
+    public function clickNext()
+    {
+        $this->_rootElement->find($this->next, Locator::SELECTOR_CSS)->click();
+    }
+
+    /**
+     * Ensure the form is loaded and fill the root form
+     *
+     * @param FixtureInterface $fixture
+     * @param SimpleElement|null $element
+     * @return $this
+     */
+    public function fill(FixtureInterface $fixture, SimpleElement $element = null)
+    {
+        $this->waitForElementVisible($this->firstField);
+        return parent::fill($fixture, $element);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94b784b8d1b86223d454899c678c635dd9a8dd8c
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SelectVersion.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<mapping strict="1">
+    <fields>
+        <upgradeVersion>
+            <selector>#selectVersion</selector>
+            <input>select</input>
+        </upgradeVersion>
+    </fields>
+</mapping>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SuccessMessage.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SuccessMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8a46e1f529220489f08dce174803b8f78fd89c9
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SuccessMessage.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * Success Message block.
+ */
+class SuccessMessage extends Block
+{
+    /**
+     * @var string
+     */
+    protected $successMessage = 'content-success';
+
+    /**
+     * @return string
+     */
+    public function getUpdaterStatus()
+    {
+        $this->waitForElementVisible($this->successMessage, Locator::SELECTOR_CLASS_NAME);
+        return $this->_rootElement->find($this->successMessage, Locator::SELECTOR_CLASS_NAME)->getText();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemConfig.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemConfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..589fa1f9e2b22655147fe391faea065b4af86804
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemConfig.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * System Config block.
+ */
+class SystemConfig extends Block
+{
+    /**
+     * @var string
+     */
+    protected $systemConfig = '.setup-home-item-configuration';
+
+    /**
+     * Click on 'System Configuration' button.
+     *
+     * @return void
+     */
+    public function clickSystemConfig()
+    {
+        $this->_rootElement->find($this->systemConfig, Locator::SELECTOR_CSS)->click();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemUpgrade.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemUpgrade.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d9cd7708e5fd927421dfdaeb77bf2a348267c96
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Block/SystemUpgrade.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Block;
+
+use Magento\Mtf\Block\Block;
+use Magento\Mtf\Client\Locator;
+
+/**
+ * System Upgrade block.
+ */
+class SystemUpgrade extends Block
+{
+    /**
+     * @var string
+     */
+    protected $systemUpgradeMessage = 'start-updater';
+
+    /**
+     * 'Upgrade' button.
+     *
+     * @var string
+     */
+    protected $upgrade = "[ng-click*='update']";
+
+    /**
+     * Get upgrade message.
+     *
+     * @return string
+     */
+    public function getUpgradeMessage()
+    {
+        return $this->_rootElement->find($this->systemUpgradeMessage, Locator::SELECTOR_NAME)->getText();
+    }
+
+    /**
+     * Click on 'Upgrade' button.
+     *
+     * @return void
+     */
+    public function clickSystemUpgrade()
+    {
+        $this->_rootElement->find($this->upgrade, Locator::SELECTOR_CSS)->click();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertApplicationVersion.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertApplicationVersion.php
new file mode 100644
index 0000000000000000000000000000000000000000..610d1ef6844391b7a462da0789edd0389bbb9072
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertApplicationVersion.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Constraint;
+
+use Magento\Backend\Test\Page\Adminhtml\Dashboard;
+use Magento\Mtf\Constraint\AbstractConstraint;
+use Magento\Mtf\Fixture\FixtureInterface;
+
+/**
+ * Check application version
+ */
+class AssertApplicationVersion extends AbstractConstraint
+{
+    /**
+     * Assert upgrade is successfully
+     *
+     * @param Dashboard $dashboard
+     * @param string $version
+     * @return void
+     */
+    public function processAssert(Dashboard $dashboard, $version)
+    {
+        \PHPUnit_Framework_Assert::assertContains(
+            $version,
+            $dashboard->getApplicationVersion()->getVersion(),
+            'Application version is incorrect.'
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "Application new version is correct.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..c77e2a0b18d1b880b5d854e2fd3357615a009e9f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessMessage.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Constraint;
+
+use Magento\Upgrade\Test\Page\Adminhtml\SetupWizard;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Check upgrade is successfully
+ */
+class AssertSuccessMessage extends AbstractConstraint
+{
+    /**
+     * Assert upgrade is successfully
+     *
+     * @param SetupWizard $setupWizard
+     * @param string $package
+     * @return void
+     */
+    public function processAssert(SetupWizard $setupWizard, $package)
+    {
+        $message = "You upgraded:";
+        \PHPUnit_Framework_Assert::assertContains(
+            $message,
+            $setupWizard->getSuccessMessage()->getUpdaterStatus(),
+            'Success message is incorrect.'
+        );
+        \PHPUnit_Framework_Assert::assertContains(
+            $package,
+            $setupWizard->getSuccessMessage()->getUpdaterStatus(),
+            'Updated package is incorrect.'
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "System Upgrade success message is correct.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessfulReadinessCheck.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessfulReadinessCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..7befbc1cf8b414616e493126e231c7747d90a7e4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertSuccessfulReadinessCheck.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Constraint;
+
+use Magento\Upgrade\Test\Page\Adminhtml\SetupWizard;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Check that Updater, Dependency, PHP Version, PHP Extensions and File Permission are ok.
+ */
+class AssertSuccessfulReadinessCheck extends AbstractConstraint
+{
+    /**
+     * Updater application message
+     */
+    const UPDATER_APPLICATION_MESSAGE = 'Updater application is available';
+
+    /**
+     * Cron script message
+     */
+    const CRON_SCRIPT_MESSAGE = 'Cron script readiness check passed';
+
+    /**
+     * Dependency check message
+     */
+    const DEPENDENCY_CHECK_MESSAGE = 'Component dependency is correct';
+
+    /**
+     * PHP version message.
+     */
+    const PHP_VERSION_MESSAGE = 'Your PHP version is correct';
+
+    /**
+     * PHP extensions message.
+     */
+    const PHP_SETTING_REGEXP = 'Your PHP settings are correct';
+
+    /**
+     * PHP extensions message.
+     */
+    const PHP_EXTENSIONS_REGEXP = '/You meet (\d+) out of \1 PHP extensions requirements\./';
+
+    /**
+     * Assert that readiness check items are passed.
+     *
+     * @param SetupWizard $setupWizard
+     * @return void
+     */
+    public function processAssert(SetupWizard $setupWizard)
+    {
+        \PHPUnit_Framework_Assert::assertContains(
+            self::UPDATER_APPLICATION_MESSAGE,
+            $setupWizard->getReadiness()->getUpdaterApplicationCheck(),
+            'Updater application check is incorrect.'
+        );
+        \PHPUnit_Framework_Assert::assertContains(
+            self::CRON_SCRIPT_MESSAGE,
+            $setupWizard->getReadiness()->getCronScriptCheck(),
+            'Cron scripts are incorrect.'
+        );
+        \PHPUnit_Framework_Assert::assertContains(
+            self::DEPENDENCY_CHECK_MESSAGE,
+            $setupWizard->getReadiness()->getDependencyCheck(),
+            'Dependency check is incorrect.'
+        );
+        \PHPUnit_Framework_Assert::assertContains(
+            self::PHP_VERSION_MESSAGE,
+            $setupWizard->getReadiness()->getPhpVersionCheck(),
+            'PHP version is incorrect.'
+        );
+        \PHPUnit_Framework_Assert::assertContains(
+            self::PHP_SETTING_REGEXP,
+            $setupWizard->getReadiness()->getSettingsCheck(),
+            'PHP settings check failed.'
+        );
+        \PHPUnit_Framework_Assert::assertRegExp(
+            self::PHP_EXTENSIONS_REGEXP,
+            $setupWizard->getReadiness()->getPhpExtensionsCheck(),
+            'PHP extensions missed.'
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "System Upgrade readiness check passed.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertVersionAndEditionCheck.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertVersionAndEditionCheck.php
new file mode 100644
index 0000000000000000000000000000000000000000..51e6a81d50a7a29661cce7b642069ebd04dc5f99
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Constraint/AssertVersionAndEditionCheck.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\Constraint;
+
+use Magento\Upgrade\Test\Page\Adminhtml\SetupWizard;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Check that package and version is correct
+ */
+class AssertVersionAndEditionCheck extends AbstractConstraint
+{
+    /**
+     * Assert that package and version is correct
+     *
+     * @param SetupWizard $setupWizard
+     * @param string $package
+     * @param string $version
+     * @return void
+     */
+    public function processAssert(SetupWizard $setupWizard, $package, $version)
+    {
+        $message = "We're ready to upgrade $package to $version";
+        \PHPUnit_Framework_Assert::assertContains(
+            $message,
+            $setupWizard->getSystemUpgrade()->getUpgradeMessage(),
+            'Updater application check is incorrect.'
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "System Upgrade edition and version check passed.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Fixture/Upgrade.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Fixture/Upgrade.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c209c4d5d8b2cd45c8423e81ab36688abd4b2b84
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Fixture/Upgrade.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd">
+    <fixture name="upgrade"
+             module="Magento_Upgrade"
+             type="virtual"
+             entity_type="upgrade"
+             handler_interface="Magento\Upgrade\Test\Handler\Upgrade\UpgradeInterface"
+             class="Magento\Upgrade\Test\Fixture\Upgrade">
+        <field name="upgradeVersion" />
+        <field name="publicKey" />
+        <field name="privateKey" />
+        <field name="optionsCode" />
+        <field name="optionsMedia" />
+        <field name="optionsDb" />
+    </fixture>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/Page/Adminhtml/SetupWizard.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Page/Adminhtml/SetupWizard.xml
new file mode 100644
index 0000000000000000000000000000000000000000..534cc1db14dbe0669ae0895a97aab3fd5bad701e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/Page/Adminhtml/SetupWizard.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
+    <page name="setupWizard" area="Adminhtml" mca="admin/backendapp/redirect/app/setup/" module="Magento_Upgrade">
+        <block name="systemUpgradeHome" class="Magento\Upgrade\Test\Block\Home" locator="body" strategy="css selector"/>
+        <block name="systemConfig" class="Magento\Upgrade\Test\Block\SystemConfig" locator="body" strategy="css selector"/>
+        <block name="authentication" class="Magento\Upgrade\Test\Block\Authentication" locator="body" strategy="css selector"/>
+        <block name="selectVersion" class="Magento\Upgrade\Test\Block\SelectVersion" locator="body" strategy="css selector"/>
+        <block name="readiness" class="Magento\Upgrade\Test\Block\Readiness" locator="body" strategy="css selector"/>
+        <block name="createBackup" class="Magento\Upgrade\Test\Block\CreateBackup" locator="body" strategy="css selector"/>
+        <block name="systemUpgrade" class="Magento\Upgrade\Test\Block\SystemUpgrade" locator="body" strategy="css selector"/>
+        <block name="successMessage" class="Magento\Upgrade\Test\Block\SuccessMessage" locator="body" strategy="css selector"/>
+    </page>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.php b/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8453fc24cf3e37c08353dcd64b06e667834fde99
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Upgrade\Test\TestCase;
+
+use Magento\Mtf\TestCase\Injectable;
+use Magento\Upgrade\Test\Page\Adminhtml\SetupWizard;
+use Magento\Backend\Test\Page\Adminhtml\Dashboard;
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Upgrade\Test\Constraint\AssertSuccessfulReadinessCheck;
+use Magento\Upgrade\Test\Constraint\AssertVersionAndEditionCheck;
+use Magento\Upgrade\Test\Constraint\AssertSuccessMessage;
+use Magento\Upgrade\Test\Constraint\AssertApplicationVersion;
+
+class UpgradeSystemTest extends Injectable
+{
+    /**
+     * Page System Upgrade Index.
+     *
+     * @var SetupWizard
+     */
+    protected $setupWizard;
+
+    /**
+     * @var Dashboard
+     */
+    protected $adminDashboard;
+
+    /**
+     * Injection data.
+     *
+     * @param Dashboard $adminDashboard
+     * @param SetupWizard $setupWizard
+     * @return void
+     */
+    public function __inject(
+        Dashboard $adminDashboard,
+        SetupWizard $setupWizard
+    ) {
+        $this->adminDashboard = $adminDashboard;
+        $this->setupWizard = $setupWizard;
+    }
+
+    /**
+     * @param array $upgrade
+     * @param FixtureFactory $fixtureFactory
+     * @param AssertSuccessfulReadinessCheck $assertReadiness
+     * @param AssertVersionAndEditionCheck $assertVersionAndEdition
+     * @param AssertSuccessMessage $assertSuccessMessage
+     * @param AssertApplicationVersion $assertApplicationVersion
+     * @return void
+     */
+    public function test(
+        FixtureFactory $fixtureFactory,
+        AssertSuccessfulReadinessCheck $assertReadiness,
+        AssertVersionAndEditionCheck $assertVersionAndEdition,
+        AssertSuccessMessage $assertSuccessMessage,
+        AssertApplicationVersion $assertApplicationVersion,
+        $upgrade = []
+    ) {
+        // Create fixture
+        $upgradeFixture = $fixtureFactory->create('Magento\Upgrade\Test\Fixture\Upgrade', ['data' => $upgrade]);
+        $createBackupConfig = array_intersect_key(
+            $upgrade,
+            ['optionsCode' => '', 'optionsMedia' => '', 'optionsDb' => '']
+        );
+        $createBackupFixture = $fixtureFactory->create(
+            'Magento\Upgrade\Test\Fixture\Upgrade',
+            ['data' => $createBackupConfig]
+        );
+        $version = $upgrade['upgradeVersion'];
+
+        if (preg_match('/^[0-9].[0-9].[0-9]/', $version, $out)) {
+            $version = array_shift($out);
+        }
+
+        // Authenticate in admin area
+        $this->adminDashboard->open();
+
+        // Open Web Setup Wizard
+        $this->setupWizard->open();
+
+        // Authenticate on repo.magento.com
+        if ($upgrade['needAuthentication'] === 'Yes') {
+            $this->setupWizard->getSystemConfig()->clickSystemConfig();
+            $this->setupWizard->getAuthentication()->fill($upgradeFixture);
+            $this->setupWizard->getAuthentication()->clickSaveConfig();
+            $this->setupWizard->open();
+        }
+
+        // Select upgrade to version
+        $this->setupWizard->getSystemUpgradeHome()->clickSystemUpgrade();
+        $this->setupWizard->getSelectVersion()->fill($upgradeFixture);
+        $this->setupWizard->getSelectVersion()->clickNext();
+
+        // Readiness Check
+        $this->setupWizard->getReadiness()->clickReadinessCheck();
+        $assertReadiness->processAssert($this->setupWizard);
+        $this->setupWizard->getReadiness()->clickNext();
+
+        // Create Backup page
+        $this->setupWizard->getCreateBackup()->fill($createBackupFixture);
+        $this->setupWizard->getCreateBackup()->clickNext();
+
+        // Check info and press 'Upgrade' button
+        $assertVersionAndEdition->processAssert($this->setupWizard, $upgrade['package'], $version);
+        $this->setupWizard->getSystemUpgrade()->clickSystemUpgrade();
+
+        $assertSuccessMessage->processAssert($this->setupWizard, $upgrade['package']);
+
+        // Check application version
+        $this->adminDashboard->open();
+        $assertApplicationVersion->processAssert($this->adminDashboard, $version);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.xml b/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..13792921f84826658ccde2542d2494b61a4330a0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Upgrade/Test/TestCase/UpgradeSystemTest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Upgrade\Test\TestCase\UpgradeSystemTest" summary="System Upgrade" ticketId="MAGETWO-45592">
+        <variation name="PerformSystemUpgrade">
+            <data name="description" xsi:type="string">System Upgrade Page</data>
+            <data name="upgrade/upgradeVersion" xsi:type="string">{version}</data>
+            <data name="upgrade/package" xsi:type="string">{package}</data>
+            <data name="upgrade/needAuthentication" xsi:type="string">No</data>
+            <data name="upgrade/publicKey" xsi:type="string">{publicKey}</data>
+            <data name="upgrade/privateKey" xsi:type="string">{privateKey}</data>
+            <data name="upgrade/optionsCode" xsi:type="string">No</data>
+            <data name="upgrade/optionsMedia" xsi:type="string">No</data>
+            <data name="upgrade/optionsDb" xsi:type="string">No</data>
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/testsuites/Magento/Mtf/TestSuite/InjectableTests/upgrade.xml b/dev/tests/functional/testsuites/Magento/Mtf/TestSuite/InjectableTests/upgrade.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99961ef2c1e5e5f003096eff40313a7a987439c6
--- /dev/null
+++ b/dev/tests/functional/testsuites/Magento/Mtf/TestSuite/InjectableTests/upgrade.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../vendor/magento/mtf/Magento/Mtf/TestRunner/etc/testRunner.xsd">
+    <rule scope="testsuite">
+        <allow>
+            <module value="Magento_Upgrade"/>
+        </allow>
+    </rule>
+</config>